【问题标题】:Shutdown Derby database using JPA not DriverManager使用 JPA 而不是 DriverManager 关闭 Derby 数据库
【发布时间】:2017-05-15 23:11:14
【问题描述】:

我有一个 RCP 客户端应用程序,它使用同一 JVM 中的嵌入式 Derby 来实现持久性。我使用 RESOURCE_LOCAL 和 Eclipse Link 作为 JPA 提供者通过 JPA 访问它。我将启动 Derby 实例留给 JPA 和 persistence.xml。

factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props);

Persistence.xml

<properties>
    <property name="eclipse.weaving" value="false" />
    <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
    <property name="javax.persistence.jdbc.url" value="jdbc:derby:pathToDb" />
    <property name="eclipselink.logging.level.sql" value="FINEST" />
    <property name="eclipselink.logging.parameters" value="true" />
</properties>

在应用程序的某一时刻,我需要停止底层的 Derby 数据库。所有示例都显示调用:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
DriverManager.getConnection("jdbc:derby:pathToDb;shutdown=true");   

这是有问题的,尤其是在具有多个类加载器的 RCP 应用程序中(它在后台使用 OSGI)。我试过使用

if (factory.isOpen())
        factory.close();

但这不会关闭 Derby 实例,只会关闭与它的 JPA 连接。

有没有办法使用 JPA 来关闭底层 Derby 实例?

更新

我尝试使用 OSGI 控制台停止与持久性相关的包,包括 javax.persistence、JPA 和 Derby。停止这些不会释放 Derby 对日志文件设置的文件锁定。

更新 2

已修订以阐明不在 OSGI 服务器应用程序中使用。

【问题讨论】:

  • 在 derby-user 邮件列表中对您的查询提出了建议:apache-database.10148.n7.nabble.com/…
  • 建议:列出由 Derby 包导出的所有服务,可能有一个暴露了驱动程序或数据库周围的包装器

标签: java jpa eclipselink derby eclipse-gemini


【解决方案1】:

问题不是类加载器而是导入问题。

一个 RCP 应用程序有一个“目标平台”,框架会动态搜索它的依赖关系。调用 Class.forName() 时不会发生这种情况。一旦我明确地将 Derby jar 添加到我的包的依赖项中,就会找到该类并且数据库正在正确关闭。

经验教训:先检查简单的东西,然后再假设它很难!

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2013-02-18
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多