我在我的应用程序中使用连接池。我的问题是:
在连接池化环境的情况下,是否明确要求在关闭连接之前关闭语句?
在连接池池环境中,连接没有关闭,(但返回到空闲连接池)。 我检查了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
)没有关于子/实现类(供应商实现类)的任何信息。
答案 0 :(得分:7)
绝对。 Statement
实现可能会有其他应该释放的资源,或者与连接有其他关系。您不应该也不应该知道实现细节。
你的方法是绝对正确的:代码接口,避免一点点“捷径”,以后可能会轻易咬你。 (即使它现在有效,它可能不会在池或连接类的未来版本中。)
答案 1 :(得分:4)
任何具有close(),release(),destroy()等的对象都会自动建议(当然你应该阅读API文档,可能有不同的名称用于此目的)对象需要调用这个方法确保在对象不再使用时释放对象资源。如果对象可以自己完成,那么没有理由提供这样的方法。
如果是池化的java.sql.Connection,连接并没有真正关闭,只是作为可用的连接在池中推回,但这是内部的东西 aka 你不应该关心。
答案 2 :(得分:2)
根据我的经验,一些JDBC驱动程序存在错误。如果您手动关闭所有语句(和ResultSet),它们似乎效果最好。否则,我看到资源泄漏不应该在关闭连接之后持续存在。