随笔 - 3, 文章 - 152, 评论 - 17, 引用 - 0
数据加载中……

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

感觉上好象是只要把connection给关闭了,系统就能正常运行了。
那在查询或是其实操作中,如果只关闭Connection,不作ResultSet 和 Statement 的关闭的话,对系统性能是否会有影响呢。或者是其实方面的不良影响。

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

补充:其实这个要看你用的是什么数据库,然后决定了你的JDBC,然后呢,决定了实现这个JDBC的方法,然后呢就决定了问题。
建议关闭。

不使用连接池的情况下,如果你直接关闭连接话,对应的Statement,ResultSet对象都应该由Driver Vendor来帮你关闭,即由他来进行资源的释放.这个是由JDBC3.0规范中提到的.因为有些数据库资源可能属于GC不能释放的范围.
对于连接池的实现而言,有时间我看看Oracle和Postgres的实现再下定论吧.但是我认为出现上面的情况应该理解成为连接池vendor的一种没有按规范来实现的问题.如果用数据库自己实现的连接池应该不会有这样的情况出现.

使用连接池时也应该会关闭PreparedStatement和ResultSet,看过Apache的DBCP,它是会关的,不知道其他连接池是怎么样的。实际上,使用不使用连接池应该对开发者透明,都应该遵循Jdbc规范,从这个角度,连接池如果没有实现关闭功能应该是有问题的。

posted on 2005-03-05 23:10 阅读(1782) 评论(0)  编辑  收藏 所属分类: 数据库相关


只有注册用户登录后才能发表评论。


网站导航: