4


JTA UserTransactionでトランザクションキャッシュ(XAResource)としてEHCacheを使用し始めましたが、少なくとも私の心の中で少し奇妙なものが表示されています。私の「表示」が間違っているかどうかを理解したいと思います。または私の理解。
次のコードはfalse

ut = getUserTransaction();
ut.begin();
MyClass a = myChache.get(key).getValue();
a.changeSomeInnerReferrence(newRefference);
ut.commit();
ut = getUserTransaction();
ut.begin();
MyClass b = myChache.get(key).getValue();
ut.commit();
return a.equals(b);

タイプのMyClassメンバーがあり、MyOtherClassそれchangeSomeInnerReferrenceが参照を現在の値からパラメーターに変更するとします。また、equalsはそのメンバーを考慮に入れていると仮定します。上記のコードの前
に追加しない限り、が返されることに気づきました。 myChache.put(key,a)ut.commit()false

何故ですか?これはキャッシュの一般的な動作ですか?commitが呼び出されると、内部参照の変更がキャッシュに伝播すると思います。

ありがとう、
イッタイ

4

1 に答える 1

2

ここで少し序文を述べますが、私はJTAのコンテキストでEHCacheを使用していません。ユーザートランザクション内で何か賢いことをする可能性はありますが、私はそれを少し疑っています。

一般的なルールは、cache.get(key)によって返される要素は値によるものです。それに対する変更は、必ずしも基になるキャッシュに反映されるとは限りません。インメモリストアがまったくなく、ディスクストアしかないことを想像すると、その背後にある理由はかなり明確になります。ディスクストアではキャッシュエントリをシリアル化する必要があるため、put/getの操作のペアは別のJavaインスタンスを返します。さらに、このような状況では、cache.get()によって返されたインスタンスへの変更がいつディスクに書き戻されるか/すべきかは明確ではありません。put()を使用すると、それが明確になります。

結局、get()から得られるのはあなたの責任です。put()と言って、EHCacheに引き継ぐように指示します。

于 2011-02-08T14:14:09.477 に答える