我有一個RCP客戶端應用程序,它在同一個JVM中使用嵌入式Derby進行持久化。我通過JPA使用RESOURCE_LOCAL和Eclipse Link作爲JPA提供程序來訪問它。我離開開始Derby實例到JPA和persistence.xml。使用JPA關閉Derby數據庫而不是DriverManager
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對日誌文件的文件鎖定。
更新2
修訂,明確的是,使用不處於OSGI服務器應用程序。
建議您在德比用戶郵件列表上進行查詢:http://apache-database.10148.n7.nabble.com/Shutdown-Derby-database-using-JPA-not-DriverManager-tp147171p147172。 html –
建議:列出Derby bundle導出的所有服務,也許有一個暴露驅動程序或數據庫的包裝 –