【问题标题】: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

【问题讨论】:

标签: java database database-connection prepared-statement


【解决方案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 端进行处理,因此客户端只能自动关闭代表这些资源的对象。

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

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多