实际上Connection.close只是断开同DB的连接,它实际并没去关闭Statement, ResultSet。之所以说Connection.close后,ResultSet无效,是因为ResultSet的操作之前,会检查连接是否有效。所以如next,first等操作都会出错。其他一些跟数据无关的操作就不会有问题。
一定要close掉ResultSet,否则资源会泄漏,因为ResultSet里有Stream对象,close才会调用Stream.close。规范说明: connection.close 自动关闭 Statement.close 自动导致 ResultSet 对象无效,注意只是 ResultSet 对象无效,ResultSet 所占用的资源可能还没有释放。所以还是应该显式执行connection、Statement、ResultSet的close方法。特别是在使用connection pool的时候,connection.close 并不会导致物理连接的关闭,不执行ResultSet的close可能会导致更多的资源泄露。

解决方案 »

  1.   

    谢谢cold_blooded(小熊)的回复,你的回答好象与我的提问关系不大。我想表达这么一种想法,即
    1 连续执行两个Statement对象的executeQuery方法时中间是否需要加一个ResultSet对象的Close方法
    2 如果不需要,那么其他方法executeUpdate和execute,他们之间相互交叉,例如
      executeQuery
      ............
      executeUpdate
      或者其他情况是否也同上因为我在jdk1.4.2的chm帮助文件上看到这么一段话,即 ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed翻译出来大致如下:结果集对象当在生成它的语句对象关闭,重新执行时(我提到的这种情况)会自动关闭,所以我认为
    连续两个executeQuery方法之间不需要执行ResultSet对象的Close方法
      

  2.   

    看文档的意思,你不需要显示的关闭 ResultSet,
    但是建议你不审显示的关闭一下比较好
      

  3.   

    那就是说你们在两个executeQuery之间调用ResultSet对象的Close方法了,我是个新手,请大家都来说几句,不调用和调用有什么区别。
      

  4.   

    我想是否调用应该归结在java对结果集对象的内存分配上,是执行一个sql语句就分配一快内存区域还是重复利用同一个内存区域,如果是后者,那么可以不需要调用ResultSet对象的Close方法,只要最后一次执行用必要的返回信息覆盖原有的内存区域即可。
      

  5.   

    严格来说这些资源的释放可以在finally里完成,严谨的程序设计应该关闭这些以释放资源。