【问题标题】:BoneCP & Derby - How to properly shutdownBoneCP & Derby - 如何正确关机
【发布时间】:2012-10-29 14:02:32
【问题描述】:

我有:

BoneCP CONNECTION_POOL = ...;
CONNECTION_POOL.getConfig().setJdbcUrl("jdbc:derby:database...;shutdown=true");
Connection connection = CONNECTION_POOL.getConnection();
connection.close();
CONNECTION_POOL.shutdown();

但是这会导致以下异常:

3274 [com.google.common.base.internal.Finalizer] ERROR com.jolbox.bonecp.ConnectionPartition - Error while closing off internal db connection
java.sql.SQLException: Cannot close a connection while a transaction is still active.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.newSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.checkForTransactionInProgress(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.close(Unknown Source)
    at com.jolbox.bonecp.ConnectionPartition$1.finalizeReferent(ConnectionPartition.java:187)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.base.internal.Finalizer.cleanUp(Finalizer.java:154)
    at com.google.common.base.internal.Finalizer.run(Finalizer.java:127)

我怎样才能避免这个异常。我已经尝试了所有我能想到的方法......

【问题讨论】:

  • 你使用的是嵌入式驱动吗?
  • 这是完整的堆栈跟踪吗?还是你在修剪它?奇怪的是,您的代码都没有出现在该堆栈跟踪中......
  • 这就是完整的堆栈跟踪。如果您运行该代码,那正是您所得到的。

标签: java jdbc derby bonecp


【解决方案1】:

除非您运行的是 v0.8.1-beta2 或更高版本,否则请在您的配置中将“disableConnectionTracking”设置为 true。

请注意,在成功关闭后,您还应该期待 Derby 的 SQLException:http://db.apache.org/derby/docs/dev/devguide/tdevdvlp40464.html

【讨论】:

  • 这个问题仍然存在,问题是调用实际上并没有像您直接执行 DriverManager.getConnection(...) 那样关闭数据库。所以无论 BoneCP 在做什么,它都不会像往常一样让 Derby Thread 结束……
猜你喜欢
  • 2012-03-08
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多