使用 JPA 而不是 DriverManager 关闭 Derby 数据库
Shutdown Derby database using JPA not DriverManager
我有一个 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");
这是有问题的,尤其是在具有多个 class 加载程序的 RCP 应用程序中(它在幕后使用 OSGI)。我试过使用
if (factory.isOpen())
factory.close();
但这不会关闭 Derby 实例,只会关闭与它的 JPA 连接。
有没有办法使用 JPA 关闭底层 Derby 实例?
更新
我尝试使用 OSGI 控制台停止与持久性相关的包,包括 javax.persistence、JPA 和 Derby。停止这些并不会释放 Derby 对日志文件施加的文件锁。
更新 2
已修改以阐明该用途不在 OSGI 服务器应用程序中。
问题不是 classloader 而是导入问题。
RCP 应用程序有一个 "target platform" 框架动态搜索依赖项。调用 Class.forName() 时不会发生这种情况。一旦我将 Derby jar 显式添加到我的包的依赖项中,就会找到 class 并且数据库会正常关闭。
经验教训:在假设困难之前检查简单的东西!
我有一个 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");
这是有问题的,尤其是在具有多个 class 加载程序的 RCP 应用程序中(它在幕后使用 OSGI)。我试过使用
if (factory.isOpen())
factory.close();
但这不会关闭 Derby 实例,只会关闭与它的 JPA 连接。
有没有办法使用 JPA 关闭底层 Derby 实例?
更新
我尝试使用 OSGI 控制台停止与持久性相关的包,包括 javax.persistence、JPA 和 Derby。停止这些并不会释放 Derby 对日志文件施加的文件锁。
更新 2
已修改以阐明该用途不在 OSGI 服务器应用程序中。
问题不是 classloader 而是导入问题。
RCP 应用程序有一个 "target platform" 框架动态搜索依赖项。调用 Class.forName() 时不会发生这种情况。一旦我将 Derby jar 显式添加到我的包的依赖项中,就会找到 class 并且数据库会正常关闭。
经验教训:在假设困难之前检查简单的东西!