2016-05-29 7 views
0

私はSpring Cacheの新機能で、Springキャッシュの実装としてEhcacheを使用しています。
私は次のパターンについて知りたいと思います:どちらが優れていて、なぜですか?Spring Cacheでは、どのようにキャッシュとキーを設計する必要がありますか?

パターン1:多くの異なるクラスは、異なるキープレフィックスを持つ同じキャッシュを使用します。

@Cacheable(cacheNames = "myCache", key = "'user:'+#id") 
public User findOne(int id) { 
    return... 
} 

@Cacheable(cacheNames = "myCache", key = "'post:'+#id") 
public Post findOne(int id) { 
    return... 
} 

パターン2:すべてのクラスは独自のキャッシュを持っています。

@Cacheable(cacheNames = "users", key = "#id") 
public User findOne(int id) { 
    return... 
} 
@Cacheable(cacheNames = "posts", key = "#id") 
public Post findOne(int id) { 
    return... 
} 

パターン2では、ehcache.xmlに多くの<cache/>を設定する必要があります。
キャッシュが重量コンポーネントであるかどうかわかりません。
多くのキャッシュを作成するとパフォーマンスが低下しますか?

+0

どちらもしないでください。 JPAプロバイダの第2レベルのキャッシュをバイパスしようとしているようです。 Springキャッシングの代わりにそれを使用することを強くお勧めします。 –

+0

@ M.Deinum、私は、上記の例は、第2レベルのキャッシュでJPAを使用する場合には適していないことを知っています。 上記のメソッドにはJPAを呼び出すだけでなく、より多くの論理演算があると考えることができます。また、戻り値はJPAエンティティではない可能性があります。 – xzchaoo

答えて

0

第2の解決策は、より効果的で追跡可能であり、エラーを起こしにくいように見えます。

異なるテーブルのIDを生成するデータベースによっては、が矛盾します。です。したがって、最初の解決策では、いずれかの投稿がユーザーのIDと同じIDを持つ場合に問題が発生する可能性があります。このバージョンでは、最初の解決策と同じように回避策は必要ありません。

第2に、オブジェクトの種類ごとに異なる属性が必要な場合があります。例えば; timeToLiveSeconds。ユーザー情報は投稿よりも頻繁に変更されることがあります。 (例えば、ユーザのエントリ数など)

第3、maxEntriesLocalHeap。ヒープ内の異なるタイプの最新のオブジェクトをより良いオプションのように見えるようにします。

+0

こんにちは、ありがとう、私はまた、パターン2はほとんどの場合に優れていると思います。 最後の質問: パターン2では、私はehcache.xmlに多くのを設定する必要があります。 キャッシュ(Ehcacheの実装)が重量コンポーネントであるかどうかわかりませんか? 多くのキャッシュを作成するとパフォーマンスが低下しますか? – xzchaoo

関連する問題