【发布时间】:2011-05-19 22:15:59
【问题描述】:
当连接返回池时,BoneCP(或任何其他池)是否关闭连接的语句?据我了解,它不调用实际连接的关闭方法,因此没有自动关闭语句。那么,它是以任何其他方式关闭语句还是我需要手动关闭它们?
【问题讨论】:
标签: jdbc connection-pooling bonecp
当连接返回池时,BoneCP(或任何其他池)是否关闭连接的语句?据我了解,它不调用实际连接的关闭方法,因此没有自动关闭语句。那么,它是以任何其他方式关闭语句还是我需要手动关闭它们?
【问题讨论】:
标签: jdbc connection-pooling bonecp
JDBC 规范非常不清楚在正常连接关闭下应该发生什么,因此,无论您使用什么池,您都应该始终确保手动关闭语句。考虑一下,如果您将来选择切换到其他池,而该池不能满足您的预期,那么您的应用程序会发生什么情况。
对于 BoneCP,答案是否定的,它不会为您关闭您的语句,尽管它可以配置为在您忘记时关闭您的连接。这是出于性能原因,因为如果您关闭连接,某些 JDBC 驱动程序将在内部关闭任何仍处于活动状态的语句。
但是,如果您启用了语句缓存,BoneCP 将关闭所有缓存的语句。
编辑:从 v0.8.0 开始,添加了对关闭未关闭语句的支持(+ 如果需要,可以打印出打开语句的位置的堆栈跟踪)。
【讨论】:
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()”关闭连接时关闭所有打开的语句
【讨论】: