Java 在连接池环境中是否显式需要语句.close()?

Java 在连接池环境中是否显式需要语句.close()?,java,sql,jdbc,connection-pooling,Java,Sql,Jdbc,Connection Pooling,我正在应用程序中使用连接池。我的问题是: 在连接池环境中,是否明确要求在关闭连接之前关闭语句 连接池环境中的连接未关闭(但返回到空闲连接池)。 我检查了JDBC4.0功能规范。第9.4.4点明确指出: 关闭连接对象应用程序调用方法Connection.close以指示它已完成使用连接。调用对象的close方法时,从给定连接对象创建的所有语句对象都将关闭。一旦连接关闭,任何试图访问其任何方法(close、isClosed或isValid方法除外)的尝试都将导致抛出SQLException 所以jd

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

在连接池环境中,是否明确要求在关闭连接之前关闭语句

连接池环境中的连接未关闭(但返回到空闲连接池)。 我检查了JDBC4.0功能规范。第9.4.4点明确指出:

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

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


在我看来,在池环境中,这应该无关紧要,因为我们正在为接口(
java.sql.Connection
&
java.sql.Statement
)编码。因此,我们不关心实现,父类(
java.sql.Connection
)没有关于子/实现类(供应商实现类)的任何信息。
语句
实现可能有其他应该释放的资源,或者与连接有其他关系。您不知道,也不应该知道实现细节

您的方法是绝对正确的:按照接口编写代码,避免一些“捷径”,这些捷径可能会在以后很容易咬到您。(即使它现在可以工作,也可能不在池或连接类的未来版本中。)

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


对于池中的java.sql.Connection,连接并不是真正关闭的,只是作为可用连接推回到池中,但这是内部内容,您不应该在意。

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

我大学数据库课上的其他学生可以证明呼叫的重要性。关闭。我的应用程序忽略了调用close,结果在DB服务器上创建了很多延迟连接。以至于它开始阻止创建新的连接。项目到期的前一天晚上。如果jdbc规范要求所有实现在关闭连接时关闭语句,那么我们可以轻松跳过statement.close方法,以防我们使用connection.close方法(在连接池或非池环境中)。我同意您不必在意,只要池连接遵守文档定义的契约(即,关闭连接也会关闭任何相关语句)。然而,在没有这种保证的情况下,不幸的是,你确实需要小心。