4

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

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

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

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

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

根据我的说法,在池化环境的情况下这无关紧要,因为我们正在为接口(java.sql.Connection& java.sql.Statement)编码。所以我们不关心实现,父类(java.sql.Connection)没有关于子/实现类(供应商实现类)的任何信息。

4

3 回答 3

7

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

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

于 2009-06-03T16:21:03.127 回答
4

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

在池化 java.sql.Connection 的情况下,连接并没有真正关闭,只是作为可用连接推回池中,但这是内部的东西,也就是你不应该关心的。

于 2009-06-04T02:47:55.823 回答
2

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

于 2009-06-04T03:28:13.123 回答