パーシスタンスのために同じ JVM に組み込まれた Derby を使用する RCP クライアント アプリケーションがあります。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");
これは、特に複数のクラス ローダーを使用する RCP アプリケーションで問題になります (内部で OSGI を使用します)。使ってみました
if (factory.isOpen())
factory.close();
ただし、これは Derby インスタンスをシャットダウンせず、それへの JPA 接続のみをシャットダウンします。
JPA を使用して、基礎となる Derby インスタンスをシャットダウンする方法はありますか?
アップデート
OSGI コンソールを使用して、javax.persistence、JPA、Derby などの永続性関連のバンドルを停止しようとしました。これらを停止しても、Derby がログ ファイルに設定したファイル ロックは解除されませんでした。
更新 2
OSGI サーバー アプリケーションでの使用ではないことを明確にするために改訂されました。