2010-12-15 5 views
1

OSCacheからEhCacheにプロジェクトコードを移行しようとしています。グローバルEhCache容量を指定する

OSCacheは、第2レベルのHibernateキャッシュプロバイダとしてだけでなく、異なる性質の他のオブジェクトを格納するためにも使用されています。彼らは、重複していないキャッシュキーのために、衝突なしで同じキャッシュインスタンスを喜んで共有しました。

EhCacheに移行する際の大きな違いは、各領域に異なるキャッシュインスタンスがあることです。異なる性質のデータが別々に存在するため、ルックアップの速度を向上させることができるため、潜在的に優れています。残念なことに、これは設定地獄の価格があります。私に説明させてください。

OSCacheの世界では、キャッシュ容量を10000とすることにしました。今は特定のインストールで必要とするRAM容量が増えれば、50000まで簡単に増やすことができます。今、EhCacheでは、すべての地域でこのデルタの一部分を使って設定を変更しなければなりません!

さらに、1つのインストールではXタイプのオブジェクトの使用率が高くなる可能性がありますが、別のインストールではYタイプのオブジェクトのチャーン率が高くなる可能性があります。数十のインストールがあり、インストールごとに数百の異なるキャッシュがあります。そのためには、キャッシュパターンを監視して設定を調整するだけで何もしないで、たくさんの人を雇う必要があります。

私はCacheManagerに何らかの種類のグローバルキャッシュ容量設定があると予想していましたが、各内部キャッシュはエントリの使用状況に応じて容量を増やすために戦うでしょう。しかし、私がキャッシュ容量を設定するために見つけた唯一の方法は、経由であり、これはCacheManagerに対して多対1です。

私が見ることのできる唯一の選択肢は、Hibernateにすべてのエンティティに対して1つのグローバルキャッシュを使用させようとすることです。誰もそれをする方法を知っていますか?私のシナリオには他にも優れたソリューションがありますか?

答えて

2

1つのキャッシュを持ち、デコレータを追加することができます。デコレータは、あなたのリージョン名に一致する名前を持つことができます。そのため、hibernateはそれらのキャッシュを使用できますが、それらのデコレータは下に同じキャッシュを使用します。したがって、管理するキャッシュ構成は1つだけです。 Custom cache decoratorsを実装し、装飾されたキャッシュの名前を設定することで、これを達成できます。

<defaultCache maxElementsInMemory="10000" eternal="false" 
    overflowToDisk="false"/> 

<cache name="singleSharedCache" maxElementsInMemory="2000" 
    eternal="false" overflowToDisk="false"> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Person" /> 
    <cacheDecoratorFactory class="com.xyz.util.CustomEhcacheDecoratorFactory" 
     properties="name=org.hibernate.tutorial.domain.Event" /> 
</cache> 

「com.xyz.util.CustomEhcacheDecoratorFactoryは」飾らehcachesを作成するために使用されるカスタムehcacheをデコレータファクトリクラスです:

あなたはこのようehcache.xml何かを持つことができます。 "properties"属性を使用して、装飾されたehcacheを任意の方法で設定することができます。ここでは、nameプロパティを使用して、装飾された新しいehcacheの名前を設定します。他のすべての操作は、基になるキャッシュに委譲できます。

ここでこのユースケースで使用できるカスタムキャッシュデコレータを1つ提供すると、ehcache jarに含まれているgetCommandAdapterを再利用し、getName()をオーバーライドします。あなたは、コンストラクタに渡す根底にehcacheにEhcacheDecoratorAdapter代表者すべての操作を:

 

package com.xyz.util; 

import java.util.Properties; 

import net.sf.ehcache.Ehcache; 
import net.sf.ehcache.constructs.CacheDecoratorFactory; 
import net.sf.ehcache.constructs.EhcacheDecoratorAdapter; 

public class CustomEhcacheDecoratorFactory extends CacheDecoratorFactory { 

    public Ehcache createDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 

    public Ehcache createDefaultDecoratedEhcache(final Ehcache cache, 
      final Properties properties) { 
     return new EhcacheDecoratorAdapter(cache) { 
      private final String name = properties.getProperty("name"); 

      public String getName() { 
       return name; 
      } 
     }; 
    } 
} 

+0

うわー、この回答のために非常に多くのおかげで、私は間違いなくクリスマス後にこの背中を見ているだろう。 – mindas

関連する問題