1

基本上我这样做:

CONNECTION_POOL = new BoneCP(config);

然后紧接着:

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

有时(并非总是)会抛出一个org.apache.derby.iapi.error.ShutdownException. 我怀疑 BoneCP 存在某种赛车条件或线程问题,它是实例化,但我在任何地方都找不到任何东西。我确实看到了一些关于惰性实例化的东西,但是将其设置为 true 或 false 没有区别。

任何帮助将不胜感激。

4

2 回答 2

1

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

于 2013-06-28T10:30:57.720 回答
0

在某些情况下,调用 Thread.interrupt 会导致 derby 关闭。引用 Derby 指南:“作为一项规则,不要使用 Thread.interrupt() 调用来指示可能正在等待的正在访问数据库的线程,因为 Derby 可能会捕获中断并关闭与数据库的连接。使用 wait 和 notify而是打电话。”

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

无论如何,我发现的唯一解决方案是,如果您要调用 Thread.interrupt(),那么您需要调整 Derby 源代码以忽略这些线程中断。具体是noteAndClearInterrupt(...)类中的方法org.apache.derby.iapi.util.InterruptStatus

于 2013-10-09T04:52:08.060 回答