基本上我做:
CONNECTION_POOL = new BoneCP(config);
然后紧接着:
CONNECTION_POOL.getConnection().createStatement("SELECT * FROM myTable");
有时(并不总是)抛出org.apache.derby.iapi.error.ShutdownException
。我怀疑BoneCP存在某种竞争条件或线程问题,并且它是实例化的,但我无处可寻。我确实看到了一些关于惰性实例化的东西,但是将它设置为true或false没有任何区别。
非常感谢任何帮助。
答案 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