2

重複の可能性:
Java:非同期データベース書き込み用のTaskExecutor?

非常に迅速に読み書きできるようにする必要があるデータオブジェクトのマップがメモリにあります。これらのオブジェクトをプロセスの再起動後も永続的にしたいので、DBに保存したいと思います。

DBの挿入や更新を行わない方が実行時間が遅くなるので、メモリ内ですぐに実行し、後でDBとは非同期に実行したいと思います。(プロセスがクラッシュし、データが少し失われた場合でも、私には受け入れられます。)

この機能を「すぐに使える」Javaツール(できればオープンソース)はありますか?これはHibernateで簡単に実行できますか?

4

3 に答える 3

4

コメントでも述べたように、非同期書き込みが必要で、休止状態またはehcacheを使用したくない場合は次のようになります。

  1. Runnable:Javaで非同期処理を実現する唯一の方法は、Runnableを拡張する単純なクラスを使用することです。

    public class AsyncDatabaseWriter implements Runnable {
         private LinkedBlockingQueue<Data> queue = ....
         private volatile boolean terminate = false;
         public void run() {
             while(!terminate) {
                Data data = queue.take();
                // write to database
             }
         }
         public void ScheduleWrite(Data data) {
             queue.add(data);
         }
     }
    

    ここにも記載されています:Java:非同期データベース書き込み用のTaskExecutor?

  2. 分散ワーカー:システムにより多くの可動部分を導入したい場合は、セロリのような分散タスクキューのJava代替手段を試すことができます:hazelcastまたはoctobot。これには、キューとして機能するメッセージング層が必要になり、ワーカーがDBへの書き込みタスクを実行します。これはやり過ぎのように見えますが、これもユースケースとアプリを使用する規模によって異なります。非同期でDBに書き込むユースケースがある場合と非常によく似た処理を行ったため、celery(python)を使用しました。サンプルの実装はここにあります:artemis

于 2012-10-07T22:00:13.853 に答える
2

EhCacheなどでライトビハインドキャッシングを使用することを検討してください。

[...]データをデータベースに同時に書き込む代わりに、キャッシュにデータを書き込む場合、後書きキャッシュは変更されたデータをキューに保存し、バックエンドスレッドが後で書き込みを実行できるようにします。したがって、キャッシュ書き込みプロセスは、データベース書き込みを待たずに続行できるため、はるかに高速に終了します。変更されたデータは、最終的にデータベースに永続化できます。その間、キャッシュからの読み取りはすべて最新のデータを取得します。

残念ながら、ライトビハインドがHibernateと統合する方法とかどうかはわかりません(そうは思わないでください)。

于 2012-10-07T21:08:34.137 に答える
1

Hibernateでは、データベースにデータを永続化するタイミングを選択し、主にproxyオブジェクト(メモリ内に保持および操作できる)を操作しsave、データベースに挿入または更新するたびにメソッドを呼び出します。

于 2012-10-07T21:10:51.280 に答える