当连接返回池时,BONECP(或任何其他池)是否关闭连接语句?
-
30-09-2019 - |
题
当连接返回池时,BONECP(或任何其他池)是否关闭连接语句?据我了解,它不称为实际连接的关闭方法,因此没有自动说明关闭。那么,它是否以其他任何方式关闭语句,还是需要手动关闭它们?
解决方案
JDBC规范尚不清楚在正常连接下应发生什么,因此,无论您使用的池,都应该 总是 确保手动关闭陈述。考虑一下,如果您将来选择切换到另一个不会做您期望为您做的事情,请考虑您的应用程序会发生什么。
关于BONECP,答案是否定的,它不会为您关闭您的陈述,尽管如果您忘记了您的连接,它可以配置为关闭连接。这是出于绩效原因,因为如果您关闭连接,一些JDBC驱动程序将在内部关闭任何仍处于内部活跃的语句。
但是,如果您启用了语句,则BONECP将关闭任何缓存的语句。
编辑:从v0.8.0开始,添加了支持以关闭未封闭的语句(+打印出堆栈的位置的堆栈跟踪,如果需要,请打开语句的位置)。
其他提示
BONECP(0.8.0 -RC3),有2个可能的结果,
关闭一些仅用于非接近声明的配置
无论您如何为缓存语句配置如何配置) 即使您明确调用statement.close()。
有一个SpatementCache类来缓存准备序列和CallableStatement。默认值已禁用。您需要使用> 0参数来调用Bonecpconfig.setStatatementCachesize()以启用它。启用缓存后,
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()”关闭连接时,将关闭所有打开的语句。