如果使用了连接池,那么连接.Close只是表示在前台释放对该连接的使用,换句话说就是将该连接的控制权返回给连接池。并不是真正关闭连接。

解决方案 »

  1.   


    我还有个疑惑就是,如果我的连接打开了结果集,结果集不关闭.
    如果我的理解是正确的话,连接池close他并不真正关闭连接.我测试过,我从连接池取得连接一次,然后查询一次,然后close,连续做了上万次,程序依然能正常运行.
    按照我的理解,如果结果集不关闭,迟早要爆掉啊 ,可是我的程序没有.为什么?
      

  2.   

    谢谢 lxpbuaa.我的第二个问题呢?
      

  3.   

    今天晚上查了一个晚上的资料,还是有疑问.Context ctx = new InitialContext();
    DataSource m_oPumpDS = (DataSource)ctx.lookup("GenericDS");
    //}
    return m_oPumpDS.getConnection();
      

  4.   

    Statement被关闭后,ResutlSet能被自动关闭。但Connection被关闭后,Statement和ResultSet都不能被自动关闭。但这并不是说只关闭Connection,Statement和ResultSet的资源就得不到释放,只要它们不再被引用时,垃圾收集器就会自动销毁它们。 当然手工Close它们,可以更早释放资源
      

  5.   

    谢谢lxpbuaa今天晚上看了些开源得代码,懂得了一些了
      

  6.   

    lxpbuaa:我刚才想了下,我认为你这个"垃圾收集器就会自动销毁它们"观点不正确.我不清楚是否关闭物理连接,Statement是否就被关闭了?但是如果使用了连接池,在你调用连接池提供得连接得close方法后,如果连接池没有帮你关闭Statementm得话,理论上资源无法正确释放得.因为Statement有IO操作.垃圾回收器无法识自动回收IO操作得对象. 因为垃圾回收器无法判别IO操作是否已经完成.我刚才看了DBCP得源代码,他得连接得CLOSE方法自动把创建得PreparedStatement对象关闭.
    但是如果是Statement对象,则没有去关闭,对于这点行为,我没有理解DBCP为什么这样做
      

  7.   

    我想IO之类并不是问题,因为这些都是Statement等对象内建的,基本上属于内部对象引用、交叉引用等范畴。垃圾处理器能够识别这些看似仍然存在引用但实际上属于无效的对象。
    理论上,只要程序处理了异常和错误,没有错误使用全局变量、Vector等东东,“任何东西垃圾回收都能回收”是没有问题的。