其中“ds”是一个 BoneCPDataSource,初始化如下:
final BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl("...");
ds.setUser("...");
ds.setPassword("...");
ds.setCloseConnectionWatch(true);
ds.setCloseConnectionWatchTimeout(1, TimeUnit.MINUTES);
这是我在整个代码中使用它的方式:
try (Connection c = ds.getConnection()) {
// do stuff with c, this takes 10 seconds at most
c.commit();
} catch (final Exception e) {
logger.error("Report error", e);
}
但我看到了这些:
警告:BoneCP 检测到未关闭的连接,现在将尝试为您关闭它。您应该在应用程序中关闭此连接 - 启用 connectionWatch 以获得额外的调试帮助。2012 年 3 月 23 日上午 9:55:17 com.jolbox.bonecp.ConnectionPartition$1 finalizeReferent
似乎在没有关闭连接的情况下调用了连接的终结器——但这怎么可能呢?try-with-resource 不能保证连接关闭吗?
然后在此之后我开始收到这些错误:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
有没有办法让 boneCP 向我展示一个堆栈跟踪,在这些跟踪中创建了这些最终的未关闭异常?谁能提出问题可能是什么?