【问题标题】:Database connections in connection pool连接池中的数据库连接
【发布时间】:2014-04-09 02:58:05
【问题描述】:

类似这样的代码,

try{
Connection con =....
Statement stmt = ....
ResultSet set = ...
}
catch(Exception e){
...
}
finally {
con.close();
}

假设连接进入连接池:

con.close() 被调用时,它会进入连接池并保持活动状态。在某个时间点,这些连接会关闭,对吗?在这种情况下,我们是否需要关闭结果集和 stmt 对象,因为连接最终会关闭?

另外,是否有可能仍然使用 stmt/result set 对象并导致连接池中的连接未关闭的情况?

【问题讨论】:

    标签: java connection


    【解决方案1】:

    建议在不再需要资源时立即释放资源。

    最简单的方法是使用新的 try-with-resources 功能 (Java SE 7)。

    【讨论】:

    • 不会 try-with-resources 以与池相同的方式工作吗?现有元素会自动关闭吗?
    • 更准确地说,try-with-resources 是否会关闭 StatementResultSet 对象,然后将连接发送回池?
    • try-with-resource 调用 close 方法,因此它的工作方式相同。区别在于更少的样板代码和容易出错的代码。
    【解决方案2】:

    当您使用连接池时,Connection.close() 调用会将连接放回池中。当您调用 Connection.close() 时,Statement 对象将被删除。但是,AFAIK,您必须关闭 ResultSet 对象才能明确地将它们从服务器中清除。这是始终显式关闭ResultSet,Statement 而不依赖Connection.close() 的好方法。此外,如果您可以选择Spring JDBC,它将负责管理JDBC 资源。您不必担心关闭连接、语句和结果集。除此之外,来自Statement API - 当一个 Statement 对象关闭时,它当前的 ResultSet 对象(如果存在)也将关闭

    【讨论】:

    • 好的。 ResultSet 对象是否有可能阻止连接在使用后从池中关闭?可能ResultSet 仍然指向任何数据库游标或被其他资源使用?
    • 不,没有办法。正如API声称当你调用Connection.close()时,它会立即释放这个Connection对象的数据库和JDBC资源,而不是等待它们被自动释放跨度>
    • 好的,我说的是池中的连接。我只是想再次确认。在这种情况下,与我所说的类似(Aaron 的回答者)stackoverflow.com/questions/103938/…
    • 是的,我刚刚经历过。看起来它取决于服务器/库中连接池机制的实现。我们不能简单地依赖它。所以,我们要做的就是通过调用一个实用方法来关闭所有东西,这是提供的链接中的答案之一
    • 是的,这就是混乱。当API本身说关闭Statement对象将关闭ResultSet对象并关闭Connection对象时,为什么这种首先关闭ResultSetStatement然后Connection更安全的方法将关闭两者StatementResultSet 对象?
    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 2015-08-09
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2010-10-23
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多