2017-01-01 15 views
1

我有一個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服務器應用程序。

+0

建議您在德比用戶郵件列表上進行查詢:http://apache-database.10148.n7.nabble.com/Shutdown-Derby-database-using-JPA-not-DriverManager-tp147171p147172。 html –

+0

建議:列出Derby bundle導出的所有服務,也許有一個暴露驅動程序或數據庫的包裝 –

回答

0

這個問題不是類加載器,而是一個導入問題。

RCP應用程序有一個「目標平臺」,由框架動態搜索依賴關係。調用Class.forName()時不會發生這種情況。一旦我明確地將Derby jar添加到我的bundle的依賴項中,該類就被找到並且數據庫正常關閉。

獲得的經驗:在假設它很難之前檢查簡單的東西!