关闭连接会自动关闭语句和结果集吗? [复制]

Posted

技术标签:

【中文标题】关闭连接会自动关闭语句和结果集吗? [复制]【英文标题】:Does closing Connection automatically close statement and resultset? [duplicate] 【发布时间】:2012-12-11 01:13:14 【问题描述】:

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

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

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

更新: 我正在使用 DatabaseProductVersion:Oracle 数据库 11g 版本 11.1.0.0.0 驱动程序名称:Oracle JDBC 驱动程序 驱动程序版本:10.2.0.4.0

【问题讨论】:

***.com/questions/4507440/… 【参考方案1】:

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

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

此外,直接使用 JDBC 并不是最好的主意。您可以使用 Spring JDBC 来代替释放资源的问题。

【讨论】:

一个写得好的连接池应该在连接关闭时关闭相关的底层资源(除了连接本身)。编写良好的客户端代码不应依赖于此。在实践中,大多数东西都写得不好,让你的代码散发出玫瑰味是一种很好的做法。 对。我决定用 Apache 的 BasicDataSource 对其进行测试:我打开了 conn,创建了 stmt,关闭了 conn 并运行了查询。得到 SQLException "com.mysql.jdbc.StatementImpl@1095a1" is closed." “直接使用 JDBC 不是最好的主意”。为什么不? Spring 在某些情况下可能很有用,但在其他情况下只会产生不必要的开销。 由于 Spring 的建议而投反对票,与问题无关。【参考方案2】:

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

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

【讨论】:

以上是关于关闭连接会自动关闭语句和结果集吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java/SQL:是不是必须关闭()结果集/语句/连接? [复制]

WIN10自动更新后无法打印了?

怎么关IDM自动下载?

win10开盖自动开机怎么关

如何判断对端关闭了socket

IOCP怎么正确关闭socket