21

我知道 Java 中的安全模式是在 finally 块中按顺序关闭您的 ResultSet、Statement 和 Connection。

如果您关闭连接,然后尝试关闭语句(不抛出异常)。但是,如果您尝试从语句中调用任何方法,则会引发异常。

我想知道关闭连接是否会自动关闭从该连接创建的所有语句对象?

更新:
我正在使用 DatabaseProductVersion:Oracle Database 11g Release 11.1.0.0.0
DriverName:Oracle JDBC driver
DriverVersion:10.2.0.4.0

4

2 回答 2

18

是的,Connection.close API 说“立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们自动释放”。问题是应用程序通常使用数据库连接池,这些可能只是在 Connection.close 上将连接返回到池。

在任何情况下,始终显式关闭 ResultSet 和 Statement 而不依赖 Connection.close 是一个好习惯。

此外,直接使用 JDBC 并不是最好的主意。您可以改用 Spring JDBC 而忘记释放资源的问题。

于 2012-12-24T18:03:50.220 回答
4

细节最终取决于每个 JDBC 驱动程序的实现;但是,一旦关闭了与数据库的连接,与之相关的所有内容都将在 DB 端进行处理,因此客户端只能自动关闭代表这些资源的对象。

您永远不知道数据库/驱动程序可能以何种方式被破坏(例如,可能存在资源泄漏),因此最佳实践建议是明确关闭所有内容。

于 2012-12-24T17:55:05.870 回答