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