关于JDBC的close问题
关于JDBC的close问题
猪刚烈 发表于3年前
关于JDBC的close问题
  • 发表于 3年前
  • 阅读 7
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

     因为过去一直在Hibernate上开发程序,对于JDBC的直接应用相对较少。最近在编写一个从1000万的表中提取数据为全文检索做索引的程序时出现了内存益处(OutOfMemoryError)问题,经过反复排查发现问题的根源在于没有及时地close数据库的相关资源。在我的程序中,一批一批地从数据库中提取数据进行索引。一开始,为了减少不必要的开销,我只建立了一个Connection,每次将数据加载到内存时都使用这一个Connection.尽管我注意到了在每个批次执行结束后,把不必要的对象引用置空,但这并没有阻止内存益处的问题。事实上,查询的数据集并不只是由DateSet一个引用来指向的,ResultSet从属于Statement,Statement又从属于Connection,这样,单纯地把ResultSet或Statement置空并不会使它们的数据集合被GC回收。(而对于Connection来说,它被置空成为垃圾时,JVM会调用它的close方法来释放资源,但这不是好的编程习惯,我们还是应该显式地调用close来完成这一工作)。因此,我的程序的问题在于:使用一个Connection并在最后关闭它并不是问题,问题在于,在循环过程中间,没有释放Statement和ResultSet!这里所说的“释放”,是指调用它们的close方法,而不是把它们置空!或者另一个方法就是每次循环打开一个Connection,并在循环结束时关闭它。
     对于ResultSet,Statement,Connection的关闭有这样一种关系:关闭一个Statement会把它的所有的ResultSet关闭掉,关闭一个Connection会把它的所有的Statement关闭掉。以下摘自《Database Programming with JDBC and JAVA》3.3.3一节:
     The Connection, Statement, and ResultSet classes all have close( ). A given JDBC
implementation may or may not require you to close these objects before reuse. But some might
require it, since they are likely to hold precious database resources. It is therefore always a good
idea to close any instance of these objects when you are done with them. It is useful to remember
that closing a Connection implicitly closes all Statement instances associated with the
Connection.[3] Similarly, closing a Statement implicitly closes ResultSet instances associated
with it. If you do manage to close a Connection before committing with auto-commit off, any
uncommitted transactions will be lost.

共有 人打赏支持
粉丝 21
博文 708
码字总数 110
作品 1
×
猪刚烈
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: