论坛首页 Java企业应用论坛

JDBC中,如果ResultSet 和 Statement 不关闭的话,会有什么影响

浏览 26716 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-04-21  
qilong2000 写道


然后将conn返回给pool。 如果程序员忘记手动关地话。当这个线程执行完以后,stmt,rs都成垃圾,当他们被垃圾搜集地时候,gc会替我们把它们给关闭地。这就是很多代码没有关闭,仍然正常运行。



这个时候的STMT, RS 是垃圾么?

他们没有被 CONN引用么?
0 请登录后投票
   发表时间:2005-07-26  
firebody 写道
robbin 写道
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。

但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

嘿嘿,如果这样的话,那就说明连接池的设计有漏洞了。

你要看清楚啊,帅哥,robbin的结论是在回答楼主的不关闭PreparedStatement和ResultSet的时候会出现什么后果。实际编程的时候当然要把这两个东东给关了阿,怎么是连接池的设计的漏洞呢。。。寒一个先。。替Robin拍你一顿。
0 请登录后投票
   发表时间:2005-07-28  
在这个帖子里:
http://forum.iteye.com/viewtopic.php?t=13649&start=135

已经讨论的很清楚了。


非pool的情况,jdbc spec写的很清楚,connection一关闭,所有资源都关闭。


有pool的情况,对spec的字面理解有分歧,charon认为spec强制要求所有资源也都关闭,但是我认为spec讲的很模糊,很难看出到底什么意思。


这是说spec。理论上我也觉得pool的实现者应该负责关闭stmt等资源。

实际应用中,确实有vendor做的连接池并没有完全关闭statement等东西,不管这是不是vendor的问题。


结论:为了你自己的程序健壮,并且为了避免对jdbc driver的依赖,建议关闭。
只要“打开/关闭”成对出现,走遍天下都不怕,这也是spec所推荐的good practice。
0 请登录后投票
   发表时间:2005-07-28  
ajoo,在spec里面哪里的描述说可以不用关闭statement?或者是resultset? connection pool会负责关闭吗?这两个东东都应该是application负责自己打开关闭的,和connection pool有关系吗?
0 请登录后投票
   发表时间:2005-08-05  
建议还是关闭了,前一段给公司系统优化,占用的STATEMETN太多导倒经常出现连接最大数,统统一CLOSE了就好了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics