1

パーシスタンスのために同じ 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 サーバー アプリケーションでの使用ではないことを明確にするために改訂されました。

4

1 に答える 1