質問

J2EE アプリケーションにキャッシュ層を作成しました。この例では Ehcache を使用します。これにより、いくつかの課題が生じました。

この例を見てみましょう。

OrderItem orderitem = cache.getOrderItemByID("id");
OrderItem old_orderitem = cache.getOrderItemID("id");

orderitem.setStatus(1);
old_orderitem.setStatus(2);

注意しないと、これらのオブジェクトのいずれかに加えられた変更は、もう一方にも影響を及ぼします (同じオブジェクトを参照します)。orderitem をデータベースに保存し直すと、status=2 になります。

これをどうやって解決するのが最善でしょうか?

各オブジェクトに .copyObject() メソッドを作成してみました。これは、新しいオブジェクトを作成し、すべての値を設定するだけです。しかし、これは良い解決策とは思えません。

この例は単に説明するためのものです。コードはそれよりもはるかに複雑ですが、結果は同じです。

**********************2010 年 7 月 15 日更新************************ **************************

EHCache 2 には、copyRead() と copyWrite() をオンにするためのオプションがいくつかあります。そしてこれで私の問題はすべて解決されました:)

役に立ちましたか?

解決

これは可変状態の問題です。これはキャッシュだけではなく、同じオブジェクトへの複数の参照があり、そのオブジェクトが変更可能である場合も同様です。例えば:

HashMap map = new HashMap();
map.put("one", new OrderItem());
OrderItem one = map.get("one");
OrderItem two = map.get("one");
one.setStatus(1);
two.setStatus(2);

まったく同じ問題が発生します。同時環境がある場合、これはさらに複雑になります。これを解決する 1 つの方法は、不変オブジェクトのみを使用することです。そうすれば、異なる状態のオブジェクトが必要な場合は、新しいオブジェクトを作成する必要があります。また、同時プログラミングも容易になります。

オブジェクトをコピーすることを検討するのは正しいことです。オプションは次のとおりです。

それぞれに長所と短所があり、どれが最適であるかは環境によって異なります。

他のヒント

あなたは(、データベースクエリの結果など)のオブジェクトを表すデータをキャッシュするように

これはむしろオブジェクト自体よりも、(例えば、ユーザのセッションデータ、あなたが他の場所で取得するかもしれない)に聞こえます。

このような場合は、

、(ehcacheをまわり)カスタムcacheing層は、ユーザが要求を出したときにキャッシュデータからオブジェクトを作成する必要がある - これはあなたのたびにユニークなオブジェクトを与えると、あなたがオブジェクトの干渉を取得することはありませんます。

あなたはID(getOrderItemById)によってキャッシュから取得する場合

私は「=オブジェクトはの一意のidで指定されます?」それが意味することを前提と思います。 2番目の抜粋では、(または持ってしようとしている?)している2つの異なるオブジェクト、それはあなたのようなビットは、コード内で2つの矛盾した事をやろうとしているに見えるようにします。

あなたは一意-ID =「ID」を強制する可能性が常に同じオブジェクトです。あなたはステータスを設定し、それをリセットすると、それは同じオブジェクトが新しい状態を有することを意味します。おそらく、IDが同様に一致した場合はtrueを返すように.equalsメソッドを拡張したいと思います。

また、(トランザクション?)データストアから変更されたオブジェクトをマークするために、「ダーティ」フラグを使用することができます。

コピーを作る、それが同じidで走り回っている2つのオブジェクトを持つことが何を意味するのかは明らかではないのですけれども、このいずれかに対処するための悪い方法ではありません。たぶんコピーは、それがまだキャッシュに存在しないことを示すためにヌルIDを使用して作成されなければならない?

あなたのアプリケーションに適した行動は何ですか?

Ehcacheの明示的なロックAPIを介してキーをロックするためのサポートを提供します。あなたは、読み取りと書き込みロックと、キャッシュ内のキーにロックすることができます。これは、キャッシュ内の値にロックしていないので、プログラマがそう決定した場合、オブジェクトはまだ変異に開かれます。

これは、またはあなたがそれを見る方法に応じて、あなたが言及問題が解決しない場合があります。プログラマが規律されるwiling、および読み取り専用の目的のために、読み取り取得したオブジェクトを使用し、+更新のキャッシュを変更している場合は、キーの書き込みロックを持つオブジェクトを取得したときに、この作業をする必要があります。

しかし、可変状態の問題は、ジェイミーmccrindleは言及して、消えません。

参考: http://ehcache.org/documentation/explicitlocking.htmlする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top