出现这个错误是在显示JFreeChart图的时候。
在提交后需要显示两张图,显示页面是这么写的<img src="mtbf.action"/>
<img src="mttr.action"/>这是两个不同的action。 一提交后就出现You can't operate on a closed connection!!!的错误。
对上面两个action分开测试一点问题没有,但放到一起就出错。可是获取数据的每个方法都是向连接池请求新的连接,然后用完关闭。因此不可能出现对一个已关闭的连接进行操作。
而且两个action分开使用是好的,放到一起就不行。
难道他们在内存里有冲突了? 现在头疼一直找不到解决方法。
在提交后需要显示两张图,显示页面是这么写的<img src="mtbf.action"/>
<img src="mttr.action"/>这是两个不同的action。 一提交后就出现You can't operate on a closed connection!!!的错误。
对上面两个action分开测试一点问题没有,但放到一起就出错。可是获取数据的每个方法都是向连接池请求新的连接,然后用完关闭。因此不可能出现对一个已关闭的连接进行操作。
而且两个action分开使用是好的,放到一起就不行。
难道他们在内存里有冲突了? 现在头疼一直找不到解决方法。
我是用c3p0配的数据源,当我把Connection获取的方式从数据源改成jdbc最原始的连接方式后就不会有问题。 所以我认为肯定是两个action从数据源中获得的conn是同一个conn。
这是我获得conn的方法。private Connection openConnection() throws NamingException, SQLException {
Connection conn = null;
if (ds == null) {
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("jdbc/smt");
conn = ds.getConnection();
} catch (NoInitialContextException e) {
conn = getJDBCConnection();//用这个就没问题
}
} else {
conn = ds.getConnection();
}
return conn;
}
List<HashMap<Object, Object>> list = new ArrayList<HashMap<Object, Object>>();
com.foxboard.database.ResultSet rst = new com.foxboard.database.ResultSet();
try {
conn = openConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
HashMap<Object, Object> map = new HashMap<Object, Object>();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
map.put(rsmd.getColumnName(i).toLowerCase(), rs.getObject(i));
map.put(rsmd.getColumnName(i).toUpperCase(), rs.getObject(i));
map.put(i, rs.getObject(i));
}
list.add(map);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
closeConnection();
}
return rst.load(list, rst);
}
public void closeConnection() throws SQLException {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
} //每次执行查询操作都是这样写的,每个方法里都是这样写的。
String sql = "select * from c_maintain_item_t ";
DatabaseConnection dbconn = DatabaseConnection.getInstance();
ResultSet rs = dbconn.executeQuery(sql);//这里的rs实际上是一个Hashmap,不是java.sql.ResultSet
while (rs.next()) {
//...
}