2012-12-24 115 views
18

我知道Java中的安全模式是在finally块中依次关闭ResultSet,Statement和Connection。关闭连接是否自动关闭语句和结果集?

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

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

更新:
我使用DatabaseProductVersion:Oracle数据库11g第二版11.1.0.0.0
的DriverName:Oracle JDBC驱动程序
DriverVersion:10.2.0.4.0

+2

http://stackoverflow.com/questions/4507440/must-jdbc-resultsets-and-statements-be-closed-separately-although-the-connection –

回答

14

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

无论如何,最好总是直接关闭ResultSet和Statement,而不要依赖Connection.close。

此外,直接使用JDBC并不是最好的想法。你可以使用Spring JDBC,而忘记释放资源的问题。

+2

编写良好的连接池应该关闭相关的底层资源(其他比连接本身)在连接关闭时。写得好的客户端代码不应该依赖于此。在实践中,大多数事情都写得很糟糕,而且你的代码很可能会闻到玫瑰的气味。 –

+1

对。我决定用Apache的BasicDataSource测试它:我打开了conn,创建了stmt,关闭了conn并运行了查询。 SQLException“[email protected]”已关闭“ –

+0

”这不是直接使用JDBC的最佳想法“。为什么不呢?在某些情况下,Spring可能有用,但在其他情况下,只会产生不必要的开销。 –

2

的细节,最终到每个JDBC司机执行;但是,一旦与数据库的连接关闭,与它相关的所有内容都将放置在数据库端,因此客户端可以执行的任何操作都不会自动关闭表示这些资源的对象。

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