日期:2014-05-19  浏览次数:20853 次

一直不清楚:为什么Connection ResultSet要释放的呢?
一直不清楚:为什么Connection ResultSet要释放的呢?JVM不是会内存回收的吗?不释放会有什么问题?

------解决方案--------------------
有些东西是要手动显式回收的~不回收就占内存咯
------解决方案--------------------
JVM只回收那些它认为是垃圾的内存空间,而Connection ResultSet占据的内存不被认为是垃圾内存。所以要手动清除。
------解决方案--------------------
貌似JDK1.7 不用自己关啦~~~
------解决方案--------------------
In some cases, it is desirable to immediately release a Connection's database and JDBC resources instead of waiting for them to be automatically released; the close method provides this immediate release.
------解决方案--------------------
如果有很多connection,你们都等着JVM自己处理,那还不卡死了
------解决方案--------------------
其实你可以不手动close 它,等到JVM也是一样的,但是问题在于你是数据库连接,
这个连接是非常珍贵的,可能一次查询,就占了1~n个connection。

整个网站这么多人访问,你不用完就释放,别人都连不上了!~

这个才是原因了,JVM的垃圾回收机制你不确定什么时候发生。,
------解决方案--------------------
主动释放还是加快 Oracle /DB2 这些数据库端迟早释放。
最早的时候, while(rs.next()) { 这是向数据库询问还有没有数据,如果数据库说有,这就返回 true,这时数据库可能保持一个 cursor 或类似的资源,每滚动到下一行,就向数据库请求数据一次。这种情况下不释放是有并发的性能问题。

}

后来的驱动程序会智能地缓存数据在客户端,但具体实现肯定每个数据库都不一样。

如果等你把所有的事情都做完才关闭 Connection 时一并自动关闭 result set。

你尝试在 for 循环中执行 SQL 上万次,得到的 resultset 都不关闭的话,Oracle 会告诉你 Cursor exhaused,游标已用完了。