出现这个错误是在显示JFreeChart图的时候。
在提交后需要显示两张图,显示页面是这么写的<img src="mtbf.action"/>
<img src="mttr.action"/>这是两个不同的action。   一提交后就出现You can't operate on a closed connection!!!的错误。
对上面两个action分开测试一点问题没有,但放到一起就出错。可是获取数据的每个方法都是向连接池请求新的连接,然后用完关闭。因此不可能出现对一个已关闭的连接进行操作。
而且两个action分开使用是好的,放到一起就不行。
难道他们在内存里有冲突了?  现在头疼一直找不到解决方法。

解决方案 »

  1.   

    代码很简单,而且也没有问题。
    我是用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;
        }
      

  2.   

    ResultSet部分的代码关闭部分的代码
      

  3.   

    我封装了数据库操作。下面其实是每次执行查询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()) {
        //...
    }
      

  4.   

    现在的问题就是两个action的conn肯定串了,其中一个把另一个正要用的conn给关了。
      

  5.   

    两个action用的又不是同一个conn你看你的openConnection 方法用 取得有可能是一个新的 不一定是以前的那个了吧