为什么BoneCP在实例化后会导致Derby ShutdownException?

时间:2013-06-17 06:10:57

标签: java jdbc derby javadb bonecp

基本上我做:

CONNECTION_POOL = new BoneCP(config);

然后紧接着:

CONNECTION_POOL.getConnection().createStatement("SELECT * FROM myTable");

有时(并不总是)抛出org.apache.derby.iapi.error.ShutdownException。我怀疑BoneCP存在某种竞争条件或线程问题,并且它是实例化的,但我无处可寻。我确实看到了一些关于惰性实例化的东西,但是将它设置为true或false没有任何区别。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

使用对shutdown属性设置为true的getConnection调用关闭嵌入式Derby数据库。这将关闭数据库并抛出ShutdownException。没有错,但根据jdbc,getConnection只允许返回有效连接或抛出异常。并且由于无法与已关闭的数据库建立有效连接,因此必须抛出异常。所以这里的问题实际上是你使用的框架应该捕获这个异常,或者你是否应该处理它。

答案 1 :(得分:0)

在某些情况下,调用Thread.interrupt会导致derby关闭。 To quote the Derby Guide:“通常,不要使用Thread.interrupt()调用来发信号通知可能正在访问数据库的等待线程,因为Derby可能会捕获中断并关闭与数据库的连接。使用wait和notify而是打电话。“

这实际上很糟糕,因为有些库会调用Thread.interrupt等等。在某些情况下,根据您正在做的事情,这是一种很好的做法。在我看来,这是数据库引擎的一个重大设计缺陷。

在任何情况下,我发现的唯一解决方案是,如果你要调用Thread.interrupt(),那么你需要调整Derby源代码来忽略这些线程中断。特别是类noteAndClearInterrupt(...)

中的方法org.apache.derby.iapi.util.InterruptStatus