2017-01-01 9 views
1

永続性のために同じJVMに組み込みDerbyを使用するRCPクライアント・アプリケーションがあります。 JPAを介してRESOURCE_LOCALとEclipse LinkをJPAプロバイダとして使用してアクセスします。 JPAとpersistence.xmlにDerbyインスタンスを開始します。 persistence.xmlのJPA not DriverManagerを使用したシャットダウン・ダービー・データベース

<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> 

factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, props); 

は、アプリケーション内の1つの時点で、私は、根本的なDerbyデータベースを停止する必要があります。これは特に、複数のクラスローダを持つRCPアプリケーションでは、問題がある

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

(それはカバーの下にOSGIを使用しています):例はすべて、呼び出しを示しています。私は

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

を使用して試してみましたが、これは、シャットダウンダービーインスタンス、それにのみJPA接続をしません。

JPAを使用して、基礎となるDerbyインスタンスをシャットダウンする方法はありますか?

更新

私はのjavax.persistence、JPAとのダービーを含む持続性関連のバンドルを停止するOSGiコンソールを使用してみました。これらを停止しても、Derbyがログ・ファイルに記録したファイル・ロックは解放されませんでした。

アップデート2

は使用がOSGIサーバ・アプリケーションではないことを明確にするために改訂します。

+0

derby-userメーリングリストに関するご意見は、http://apache-database.10148.n7.nabble.com/Shutdown-Derby-database-using-JPA-not-DriverManager-tp147171p147172です。 html –

+0

提案:Derbyバンドルによってエクスポートされたすべてのサービスをリストします。おそらく、ドライバまたはデータベースのラッパーを公開するサービスがあります –

答えて

0

問題はクラスローダーではなくインポートの問題です。

RCPアプリケーションには、依存性のためにフレームワークによって動的に検索される「ターゲットプラットフォーム」があります。これは、Class.forName()を呼び出すときには発生しません。 Derby jarをバンドルの依存関係に明示的に追加すると、そのクラスが見つかり、データベースが正しくシャットダウンされています。

教訓:難しいと思う前に簡単なものをチェックしてください!

関連する問題