使用JPA关闭Derby数据库而不是DriverManager

时间:2017-01-01 15:58:51

标签: java jpa eclipselink derby eclipse-gemini

我有一个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服务器应用程序中。

1 个答案:

答案 0 :(得分:0)

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

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

经验教训:在假设很难之前检查一下这些简单的东西!