Connection关闭, PreparedStatement关闭, ResultSet不关闭会有什么影响?
resultset会不会持有某些资源而不释放导致系统越来越卡,甚至内存溢出?注意:项目是部署在weblogic里面的java程序,连接的获取方式是通过连接池的方式获取的。...
resultset会不会持有某些资源而不释放导致系统越来越卡,甚至内存溢出?
注意:项目是部署在weblogic里面的java程序,连接的获取方式是通过连接池的方式获取的。 展开
注意:项目是部署在weblogic里面的java程序,连接的获取方式是通过连接池的方式获取的。 展开
5个回答
展开全部
搜索到这么一段,觉得挺有道理
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。
展开全部
通常我们会使用以下代码,其中ResultSet可以理解为定义的一个指针,实际上并没有为他分配内存空间。所以当PreparedStatement关闭时, ResultSet所指向的是一个不可用空间相当于ResultSet也被关闭了。
以下代码亲测:
Connection conn = getConn();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
closeAll(ps, conn);
}
//测试部分
try {
rs.next();
} catch (SQLException e) {
e.printStackTrace();
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
连接池也有分多种的,比如Hibernate使用的C3P0数据源,它是会自动关闭
Connection
PreparedStatement
ResultSet
其实不管是通过连接池还是直接连数据库,都有好坏。建议楼主在用连接池的时候,自己在一段时间可以关闭整个程序,释放连接池的资源,省的出现资源被大量占用!
Connection
PreparedStatement
ResultSet
其实不管是通过连接池还是直接连数据库,都有好坏。建议楼主在用连接池的时候,自己在一段时间可以关闭整个程序,释放连接池的资源,省的出现资源被大量占用!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
连接关闭就可以了。用的连接池,即使你不关闭连接,过一段时间不使用,连接池也会关闭它
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用连接池就算不close也会自动回收,不过最好是写上。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询