3

AOPを使用したHibernateおよびSpring管理トランザクションを備えたマルチスレッドマルチサーバーWebアプリケーションがあります。問題は、メモリ内のデータを維持し、データベースの状態を最新の状態に保つ必要があることです...基本的に、メモリ内のキャッシュを実装しています。

さて、メモリ内のpojoを休止状態/春のトランザクション性と同じレベルでトランザクション化する方法はありますか?30クラスの深さでサービス呼び出しを階層化していますが、コミットがどこで発生するかわかりません。私のオプションは何ですか?

4

2 に答える 2

2

私があなたの必要性をよく理解しているなら、あなたはいくつかの文脈で、繊細な何かを求めています。私が正しく理解しているかどうかを確認するために、例を試してみましょう:

  1. スレッドT1はキャッシュ内のpojoPを読み取り、バージョンP1を取得します。
  2. スレッドT2はキャッシュ内のpojoPを読み取り、バージョンP1を取得します。
  3. スレッドT2はトランザクションを開始し、同じpojoを読み取り、バージョンP2を作成する値を変更します。
  4. スレッドT1はキャッシュ内のpojoPを読み取りますが、バージョンP1を取得します。これには、ポイント3で、T2が同じオブジェクトではなくバージョンP1のコピーP2を受信する必要があります。
  5. スレッドT2はPを保存し、T1とT2のどちらでも何も変更されず、バージョンが異なります。
  6. スレッドT2はトランザクションを閉じます
    。ロールバックの場合、T2はT1と同様にP1を使用します。
    b。コミットした場合、T2は引き続きP2を使用します。ただし、T1はP2も使用する必要があります。

これは複雑な問題であることがわかります。過小評価しないでください。すでに理論レベルでは、解決すべき多くの問題があります(そして、コーディングするとさらに多くの問題が発生します...)。アーキテクチャを正常に使用するには、アーキテクチャを明確にする必要があります。そうでなければ、あなたはあなたの精神的な正気を危険にさらします;-)

まず、あなたは本当にそのようなものが欲しいことを確認する必要があります!


あなたが本当にそれを望むなら..

テクニカルコード(AOP、ThreadLocal)を使用して、このトリッキーな複雑さを関数型コードから隠すことをお勧めします

  • コミット/ロールバックはすでにAOPを介して行われている可能性が高いため、これは問題ありません。

  • Pのインスタンス(場合によっては保存されたキャッシュ内のインスタンス、場合によってはコピー)の取得を非表示にするには:Storeというクラスを使用して値をキャッシュに保存し、Store型のThreadLocal変数を設定します。現在のスレッドにThreadLocal変数を使用します。

    • Storeインスタンスは、関数型コードではなく、トランザクションAOPコードでのみ変更できます。
    • 関数型コードは、エンティティを操作するために現在のThreadLocalインスタンスを使用します(保存など...)
    • トランザクションの外部では、ThreadLocalインスタンスがキャッシュされたインスタンスであるため、CACHEと呼びましょう。
    • トランザクションを入力すると、現在のスレッドに別のThreadLocalインスタンスが設定されます。そのクラスはStoreのサブクラスであり、要求されたときにキャッシュオブジェクトのコピーを返します。クラスは、一部が保存されているかどうかも記憶します(したがって、この特別なAPIを使用して保存するか、通常の保存APIで通知する必要があります)
    • トランザクションをロールバックすると、ThreadLocalインスタンスが破棄され、現在のスレッドに対してCACHEDインスタンスが再インストールされます。
    • トランザクションをコミットすると、 ThreadLocalインスタンスに記憶されているすべてのデータベース操作が実行され、それを適用してCACHEDインスタンスを変更し、現在のスレッドのCACHEDインスタンスを再インストールします。
于 2009-09-22T16:31:16.740 に答える
1

Hibernateの第2レベルのキャッシュを使用しても、要件を満たしていませんか?JBossCacheプロバイダーは分散型とトランザクション型の両方です。

それがうまくいかない場合は、意味のある応答を得るために、その理由と実際に達成しようとしていることを説明する必要があります。

于 2009-09-22T16:41:31.227 に答える