java中可以直接关闭获得的Connection 实例,关闭数据库连接实例后,所有建立在这个数据库实例上面的资源,结果集便自动关闭

解决方案 »

  1.   

    你可以每次都去关闭ResultSet,pstmt,conn等资源。
    但是如果你直接关闭connection的话,这个conn上的其他资源也会被关闭,就像楼上说的那样
      

  2.   

    对于connection、resultset等等之类的资源,建议的做法是:遵循谁打开谁关闭,尽量不要在一个方法中打开传入另一个方法中关闭,这样很容易出问题。
      

  3.   

    如果有resultSet的话,一般会有try-catch模块,你可以再catch模块后面的finally模块里面把连接都关了,这样在处理完resultset后会关闭你打开的连接
      

  4.   

    可以动态代理,重新resultSet的的close方法
      

  5.   

    可以考虑在 login 去调用一个持久层访问 statement 时提供一个 call back 让它来自己取数据。持久层只负责连接到数据库并执行 SQL, 至于 ResultSet 中的数据如何使用则用 callback 来负责,查询完了立即关闭了连接。如:
    public void doQuery(String sql, Filler callback) {
         ...
         try {
         callback.beginData();
         while(rs.next() ) {
                   callback.next(); 
        }
        callback.endData();
       } catch (SQLException e) {
             callback.processException(e);
       }
      try {
        rs.close();
       stmt.close();
       conn.close();
       } catch (SQLException e) {
         // 这里 不是Callback 的职责。
       }
    }
      

  6.   

    如果是 java web 程序,可以在web里加一个过滤器,得到的连接全部放到 request 里,或者通过 ThreadLocal 存储当前线程使用的 Connection,当返回时,则从 request 或者从 ThreadLocal 中取出Connection,并且关闭它。这样,程序别的地方就不用关心连接是否被关闭的事了。