You can't operate on a closed connection!!!

bluesnaker 2010-07-23 09:34:03
出现这个错误是在显示JFreeChart图的时候。
在提交后需要显示两张图,显示页面是这么写的

<img src="mtbf.action"/>
<img src="mttr.action"/>

这是两个不同的action。 一提交后就出现You can't operate on a closed connection!!!的错误。
对上面两个action分开测试一点问题没有,但放到一起就出错。

可是获取数据的每个方法都是向连接池请求新的连接,然后用完关闭。因此不可能出现对一个已关闭的连接进行操作。
而且两个action分开使用是好的,放到一起就不行。
难道他们在内存里有冲突了? 现在头疼一直找不到解决方法。
...全文
1137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesnaker 2010-07-23
  • 打赏
  • 举报
回复
现在的问题就是两个action的conn肯定串了,其中一个把另一个正要用的conn给关了。
bluesnaker 2010-07-23
  • 打赏
  • 举报
回复
我封装了数据库操作。下面其实是每次执行查询sql的操作,查出来的结果都放在自己定义的ResultSet ,其实是一个Hashmap。

public com.foxboard.database.ResultSet executeQuery(String sql) throws SQLException {
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()) {
//...
}
sun0322 2010-07-23
  • 打赏
  • 举报
回复
ResultSet部分的代码

关闭部分的代码
bluesnaker 2010-07-23
  • 打赏
  • 举报
回复
代码很简单,而且也没有问题。
我是用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;
}
sun0322 2010-07-23
  • 打赏
  • 举报
回复
代码!
yearnqiao 2010-07-23
  • 打赏
  • 举报
回复
两个action用的又不是同一个conn

你看你的openConnection 方法用 取得有可能是一个新的 不一定是以前的那个了吧
bluesnaker 2010-07-23
  • 打赏
  • 举报
回复
沒人理我嗎?

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧