【问题标题】:Why is BoneCP causing Derby ShutdownException after instantiation?为什么 BoneCP 在实例化后会导致 Derby ShutdownException?
【发布时间】:2013-06-17 06:10:57
【问题描述】:

基本上我会这样做:

CONNECTION_POOL = new BoneCP(config);

然后紧接着:

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java jdbc derby javadb bonecp


    【解决方案1】:

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

    【讨论】:

    • 确实如此。配置似乎设置了shutdown = true,但可能不应该。
    【解决方案2】:

    在某些情况下调用 Thread.interrupt 会导致 derby 关闭。 To quote the Derby Guide:“作为一项规则,不要使用 Thread.interrupt() 调用来通知可能正在等待的正在访问数据库的线程,因为 Derby 可能会捕获中断并关闭与数据库的连接。请改用等待和通知调用。”

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多