【问题标题】:Does BoneCP (or any other pool) close connection's statements when connection is returned to pool?当连接返回池时,BoneCP(或任何其他池)是否会关闭连接的语句?
【发布时间】:2011-05-19 22:15:59
【问题描述】:

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

【问题讨论】:

    标签: jdbc connection-pooling bonecp


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      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()”关闭连接时关闭所有打开的语句

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多