3

基本的なこと:私は、埋め込まれたDB4Oデータベースに裏打ちされたDataNucleusを使用しています。

この簡単なテストを行う場合:

    PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
    PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManager();

    pm1.makePersistent(t1);
    pm2.makePersistent(t2);

ファイルロック例外が発生します:

com.db4o.ext.DatabaseFileLockedException: C:\<path>\primary_datastore.data

これは、がどのように機能するのかわからないことを教えてくれますPersistenceManagerPersistenceManagerFactoryデータをクエリまたは永続化する必要があるときはいつでも電話をかけただけでPersistenceManager、スレッドセーフなものが得られると思いました。

  • アプリケーション全体でPersistenceManagerをシングルトンにする必要がありますか?
  • JDO / DataNucleusでは、クエリと更新を実行する複数のスレッドはどのように機能しますか?
4

4 に答える 4

2

ちなみに、私はDB4Oをリッピングして、NeoDatisをポップし(5分のタスクを作成してくれてありがとうDN)、私を困惑させて手を投げた半ダースのテストケースのそれぞれが魔法のように機能しました。並行トランザクションは、想定どおりに動作しました。シリアル化可能なオブジェクトのコレクション(別の、しかし同様に苛立たしい問題)と、これらの派生物である少なくとも4つのオブジェクトのコレクションを突然永続化する可能性があります。

おそらく、DB4Oを誤って構成したことによる私のせいですが(私は考えられる限りのバニラインストールを行っていましたが)、NeoDatisは「それだけで機能する」カテゴリで大きなボーナスポイントを獲得しました。両方のバニラ組み込みインストールは、両方ともファイルを作成し、両方ともDataNucleusを介してJDOに応答します。

5分間のNeoDatisの至福で消された3日間の地獄の後でDB4Oに戻ることは想像できません。:)

于 2010-10-29T04:44:09.480 に答える
2
  • シングルトンインスタンスを作成する必要はありません。代わりに、DataNucleusはPersistenceManagerプロキシを使用することをお勧めします。

したがって、ガイドに従うと、コードはこの変更で機能するはずです。

PersistenceManager pm1 = persistenceManagerFactory.getPersistenceManager();
PersistenceManager pm2 = persistenceManagerFactory.getPersistenceManagerProxy();

pm1.makePersistent(t1);
pm2.makePersistent(t2);

2番目のインスタンスは、インスタンス化された最初のPersistenceManagerを参照するプロキシです。

  • PersistenceManagerスレッドを安全にするには、PersistenceManagerFactoryで(またはそのエイリアス)プロパティを設定する必要datanucleus.ConnectionFactoryありjavax.jdo.option.Multithreadedます。

たとえば、プログラムで設定します。

Properties properties = new Properties();
properties.setProperty("javax.jdo.PersistenceManagerFactoryClass",
                "org.datanucleus.jdo.JDOPersistenceManagerFactory");
//configure connection, etc...
properties.setProperty("javax.jdo.option.Multithreaded", "true");
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);
于 2010-10-28T07:20:40.767 に答える
2

アプリケーション全体でPersistenceManagerをシングルトンにする必要がありますか?

それはあなたのアプリケーションに依存します。デスクトップアプリケーションを開発する場合、おそらく必要なのは1つの永続性マネージャーだけです。このpersistence-managerは、desktop-appのデータベースの状態を表します。ただし、他のシナリオではそうではありません。たとえば、Webアプリケーションでは、要求またはセッションを相互に分離する必要があります。したがって、複数のPersistenceManagerを使用します。たとえば、リクエストごとのPersistenceManagerです。各PersistenceManagerは、現在のリクエストの状態とトランザクションを保持します。

したがって、PersistenceManager-instanceは、ユニットワーク/トランザクションを表します。

于 2010-10-28T09:16:06.510 に答える
1

「ファイル」モードで操作する場合、db4oが同時リクエストをどの程度正確にサポートすると思いますか?サーバーモードが前提条件だと思っていただろう

于 2010-10-28T11:10:15.877 に答える