使用jpa而不是DriverManager关闭德比数据库



我有一个RCP客户端应用程序,该应用程序使用同一JVM中的嵌入式德比进行持久。我使用Resource_local和Eclipse链接作为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>

在应用程序中的某一时刻,我需要停止基础的德比数据库。所有示例都显示:

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

这是有问题的,尤其是在带有多个类加载程序的RCP应用程序中(它在封面下使用OSGI)。我尝试使用

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

,但这不会关闭德比实例,只有JPA连接到它。

有没有办法使用JPA关闭基础德比实例?

update

我尝试使用OSGI控制台来停止持久性相关捆绑包,包括Javax.persistence,JPA和Derby。停止这些没有释放德比在日志文件上放置的文件锁。

更新2

修订以澄清使用不在OSGI服务器应用程序中。

问题不是classloader,而是导入问题。

RCP应用程序具有"目标平台",该应用程序通过依赖项的框架动态搜索。当调用class.forname()时,这不会发生。一旦我明确地将德比罐添加到捆绑包的依赖项中,就找到了类,并且数据库正正确关闭。

学习的课程:在假设很难之前检查简单的东西!

最新更新