4

当连接返回池时,BoneCP(或任何其他池)是否会关闭连接的语句?据我了解,它不调用实际连接的关闭方法,因此没有自动关闭语句。那么,它是以任何其他方式关闭语句还是我需要手动关闭它们?

4

2 回答 2

5

JDBC 规范非常不清楚在正常连接关闭下应该发生什么,因此,无论您使用什么池,您都应该始终确保手动关闭语句。考虑一下,如果您将来选择切换到一个不同的池,而该池不能满足您的预期,您的应用程序会发生什么。

至于 BoneCP,答案是否定的,虽然它可以配置为在您忘记时关闭您的连接,但它不会为您关闭您的语句。这是出于性能原因,因为如果您关闭连接,某些 JDBC 驱动程序将在内部关闭任何仍处于活动状态的语句。

但是,如果您启用了语句缓存,BoneCP 将关闭所有缓存的语句。

编辑:从 v0.8.0 开始,已添加支持以关闭未关闭的语句(+ 如果需要,打印出打开语句的位置的堆栈跟踪)。

于 2010-12-04T14:20:08.320 回答
1

BoneCP (0.8.0 -RC3),有两种可能的结果,

仅对非缓存语句进行一些配置

无论您如何为缓存语句配置它,即使您显式调用 statement.close() 也不会关闭。

有一个 StatementCache 类来缓存preparedStatement & callableStatement。默认为禁用。您需要使用 >0 参数调用 BoneCPConfig.setStatementsCacheSize() 来启用它。启用缓存后,

1 BoneCP.Statement.Close() 将绕过底层语句关闭,如果它被缓存。

  public void close() throws SQLException {
      this.connectionHandle.untrackStatement(this);
  this.logicallyClosed.set(true);
  if (this.logStatementsEnabled){
        this.logParams.clear();
        this.batchSQL = new StringBuilder();
      }

      if (this.cache == null || !this.inCache){ // no cache = throw it away right now
           this.internalStatement.close();
  }
}

2 BoneCP.Connection.close() 将只是简单地通过函数“clearStatementCaches()”清除缓存

好消息是 MYSQL JDBC 驱动程序,Connector/J,将在您通过函数“closeAllOpenStatements()”关闭连接时关闭所有打开的语句

于 2013-09-22T16:28:10.210 回答