精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-04-21
qilong2000 写道 然后将conn返回给pool。 如果程序员忘记手动关地话。当这个线程执行完以后,stmt,rs都成垃圾,当他们被垃圾搜集地时候,gc会替我们把它们给关闭地。这就是很多代码没有关闭,仍然正常运行。 这个时候的STMT, RS 是垃圾么? 他们没有被 CONN引用么? |
|
返回顶楼 | |
发表时间:2005-07-26
firebody 写道 robbin 写道 如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。 嘿嘿,如果这样的话,那就说明连接池的设计有漏洞了。 你要看清楚啊,帅哥,robbin的结论是在回答楼主的不关闭PreparedStatement和ResultSet的时候会出现什么后果。实际编程的时候当然要把这两个东东给关了阿,怎么是连接池的设计的漏洞呢。。。寒一个先。。替Robin拍你一顿。 |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2005-07-28
ajoo,在spec里面哪里的描述说可以不用关闭statement?或者是resultset? connection pool会负责关闭吗?这两个东东都应该是application负责自己打开关闭的,和connection pool有关系吗?
|
|
返回顶楼 | |
发表时间:2005-08-05
建议还是关闭了,前一段给公司系统优化,占用的STATEMETN太多导倒经常出现连接最大数,统统一CLOSE了就好了
|
|
返回顶楼 | |