当连接返回到池时,BoneCP(或任何其他池)是否会关闭连接的语句?

时间:2010-12-03 18:50:31

标签: jdbc connection-pooling bonecp

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

2 个答案:

答案 0 :(得分:5)

JDBC规范非常不清楚在正常连接关闭时应该发生什么,所以无论你使用哪个池,你应该总是确保手动关闭语句。如果您选择在将来切换到不符合预期的池,请考虑您的应用程序会发生什么。

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

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

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

答案 1 :(得分:1)

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

仅关闭非缓存语句的某些配置

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

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

1如果高速缓存,则BoneCP.Statement.Close()将绕过基础语句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()”关闭连接时关闭所有打开的语句