连接池环境中是不是明确要求 statement.close()?

Posted

技术标签:

【中文标题】连接池环境中是不是明确要求 statement.close()?【英文标题】:Is statement.close() explicitly required in connection pooled environment?连接池环境中是否明确要求 statement.close()? 【发布时间】:2010-10-31 01:08:04 【问题描述】:

我在我的应用程序中使用连接池。我的问题是:

在连接池环境的情况下,是否明确要求在关闭连接之前关闭语句?

在连接池环境中,连接没有关闭,(而是返回到空闲连接池)。 我检查了 jdbc 4.0 功能规范。在第 9.4.4 点中,它明确指出:

关闭连接对象 应用程序调用 Connection.close 方法来指示它已完成使用连接。当调用对象的 close 方法时,从给定 Connection 对象创建的所有 Statement 对象都将被关闭。关闭连接后,任何尝试访问其任何方法(close、isClosed 或 isValid 方法除外)的任何尝试都将导致抛出 SQLException。

所以 jdbc 规范要求在关闭连接时关闭所有语句。那么它仅适用于非连接池环境还是也适用于连接池环境?

在我看来,在池化环境中这无关紧要,因为我们正在为接口编码(java.sql.Connectionjava.sql.Statement)。所以我们不关心实现和父类(java.sql.Connection)没有关于子/实现类(供应商实现类)的任何信息。

【问题讨论】:

如果 jdbc 规范要求所有实现在关闭连接时关闭语句,那么如果我们使用 connection.close 方法(在连接池或非连接池中),我们可以轻松跳过 statement.close 方法池化环境)。 【参考方案1】:

任何具有 close()、release()、destroy() 等的对象都会自动建议(当然你应该阅读 API 文档,可能有不同的名称用于此目的)该对象需要调用这种方法可以保证当对象不再使用时释放对象资源。如果对象可以自己做,就没有理由提供这种方法。

在池化 java.sql.Connection 的情况下,连接并没有真正关闭,只是作为 available 连接被推回池中,但这是 internal stuff aka 你不应该关心

【讨论】:

我同意你不应该关心,只要池连接遵守文档定义的合同(即关闭连接也会关闭任何关联的语句)。但是,在没有这样的保证的情况下,很遗憾,您确实需要小心。【参考方案2】:

根据我的经验,一些 JDBC 驱动程序存在错误。如果您手动关闭所有语句(和结果集),它们似乎效果最好。否则,我看到了在关闭连接之后不应该持续存在的资源泄漏。

【讨论】:

【参考方案3】:

当然。 Statement 实现可能会有其他资源应该被释放,或者与连接有其他关系。您不知道也不应该知道实现细节。

您的方法是绝对正确的:对界面进行编码,并避免可能在以后很容易咬到您的小“捷径”。 (即使它现在可以工作,它可能不会在池或连接类的未来版本中。)

【讨论】:

我大学数据库班的其他学生可以证明调用 .close 的重要性。我的应用程序忽略了调用 close 并最终在数据库服务器上创建了许多挥之不去的连接。以至于它开始阻止创建新的连接。项目到期的前一天晚上。

以上是关于连接池环境中是不是明确要求 statement.close()?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的 SQLite 连接池 - 锁定数据库

HttpClient高并发下性能优化-http连接池

springboot中的那些连接池

要求在多线程环境中明确 TransformerFactory 的 XSLT Transformer

转数据库连接池到底应该设多大

连接池和单点登录