关闭连接是否自动关闭语句和结果集?

22

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

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

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

更新:
我正在使用的数据库产品版本为:Oracle Database 11g Release 11.1.0.0.0
驱动程序名称:Oracle JDBC驱动程序
驱动程序版本:10.2.0.4.0


2
https://dev59.com/Fm855IYBdhLWcg3wJg1y - Aviram Segal
2个回答

19

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

无论如何,最好的做法是始终明确关闭ResultSet和Statement,而不是依赖于Connection.close。

另外,直接使用JDBC并不是最佳选择。您可以使用Spring JDBC代替,并忘记释放资源的问题。


3
一个写得好的连接池应该在连接关闭时关闭相关的基础资源(除了连接本身)。良好编写的客户端代码不应该依赖于这一点。实际上,大多数东西都写得很糟糕,因此让你的代码发挥最佳状态是个好习惯。 - Tom Hawtin - tackline
1
我决定使用Apache的BasicDataSource进行测试:我打开了连接(conn),创建了语句(stmt),关闭了连接(conn)并运行了查询。结果出现了SQLException错误,提示“com.mysql.jdbc.StatementImpl@1095a1”已关闭。 - Evgeniy Dorofeev
“直接使用JDBC并不是最好的选择。”为什么呢?Spring在某些情况下可能很有用,但在其他情况下只会增加不必要的开销。 - Greg Brown
因为Spring的建议而被踩,与问题并不真正相关。 - Koray Tugay

4

具体细节归每个JDBC驱动程序实现;但是,一旦与数据库的连接关闭,与其相关的所有内容都将在DB端处置,因此客户端所能做的就只有自动关闭表示这些资源的对象。

你永远不知道数据库/驱动程序可能出现什么问题(例如可能会出现资源泄漏),因此最佳实践建议是显式地关闭所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接