ehcacheのcopyonreadおよびcopyonwriteに相当するinfinispan
-
04-10-2019 - |
質問
既存のWebアプリにキャッシュソリューションを実装する予定です。複雑なことはありません:基本的には、ディスクと自動立ち退きにあふれることをサポートする同時マップ。キャッシュをクラスタリングすることは、将来的には要件になる可能性がありますが、現在ではありません。
EhcacheのCopyOnReadとCopyOnWrite機能が好きです。これは、キャッシュから取るものを変更する前に手動で物事をクローンする必要がないことを意味するからです。今、私は見始めました infinispan, 、しかし、私はそこで同等のものを見つけていません。それは存在しますか?
つまり、次の単体テストに合格する必要があります。
@Test
public void testCopyOnWrite() {
Date date = new Date(0);
cache.put(0, date);
date.setTime(1000);
date = cache.get(0);
assertEquals(0, date.getTime());
}
@Test
public void testCopyOnRead() {
Date date = new Date(0);
cache.put(0, date);
assertNotSame(cache.get(0), cache.get(0));
}
解決
JBossの開発者によると、Infinispanはまだそのような機能をサポートしていません。強化のリクエストをログに記録する必要があります Infinispan Issueトラッカー, 、他の人がそれに投票することができるように(私はそうします)。
そうは言っても、この機能が必要な場合 今, 、回避策は拡張することです AbstractDelegatingCache, 、そしてオーバーライドします get
と put
この機能を追加する方法。独自のコピー戦略を使用したり、Ehcacheがインスピレーションを得たりした方法を確認できます。
また、あなたはそれを考慮することができます Infinispanフォーラム さらに質問がある場合は、Infinispanコミュニティからより多くの意見があるためです。
他のヒント
infinispan します 実際の形式はプラグできないにもかかわらず、CopyOnRead/CopyOnWriteをサポートします。構成要素はです LazyDeerialization Infinispan 4.xおよび storeasbinary Infinispan 5.x。オブジェクトは、ネットワーク上のRPC呼び出しやディスクへのストレージを含む、あらゆる形態のマーシャリングに使用されるプラグ可能なMarshallerフレームワークを使用してシリアル化されます。
私は信じている storeAsBinary
オブジェクトをシリアル化する必要がある場合にのみ有効になります。つまり、 put
操作は呼ばれ、所有者は現在のノードではありません。
これはまた、キーの所有者が 0
現在のノードではありませんが、単一のノード環境である場合でも失敗します。