1

プロジェクト コードを OSCache から EhCache に移行しようとしています。

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

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

OSCache の世界では、キャッシュ容量をたとえば 10000 に設定します。特定のインストールでより多くの RAM が必要な場合、またはその余裕がある場合は、簡単に 50000 まで増やすことができます。EhCache で、すべての地域のこのデルタの部分ごとに設定を変更する必要があります。

さらに、あるインストールではタイプ X のオブジェクトの使用率が高く、別のインストールではタイプ Y のオブジェクトのチャーンが多い場合があります。数十のインストールがあり、各インストールには数百の異なるキャッシュがあります。このためには、キャッシュ パターンの監視と設定の微調整だけを行うだけの人を大量に雇わなければなりません。

CacheManagerある種のグローバル キャッシュ容量設定があることを期待していましたが、エントリの使用状況に応じて、各内部キャッシュがより多くの容量を求めて戦います。ただし、キャッシュ容量を設定する唯一の方法は、CacheConfigurationに対して多対 1 である経由CacheManagerです。

これまでのところ、Hibernate がすべてのエンティティに対して 1 つのグローバル キャッシュを使用するように強制するしかありません。誰もそれを行う方法を知っていますか? 私のシナリオに適した他の解決策はありますか?

4

1 に答える 1

2

1つのキャッシュを用意し、その周りにデコレータを追加してみてください。デコレータはリージョン名と一致する名前を持つことができるため、休止状態ではこれらのキャッシュを使用できますが、これらのデコレータはその下で同じキャッシュを使用します。したがって、管理するキャッシュ構成は1つだけです。これは、カスタムキャッシュデコレータを実装し、装飾されたキャッシュの名前を設定することで実現できます。

ehcache.xmlは次のようになります。

<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」は、装飾されたehcacheを作成するために使用されるカスタムehcacheデコレータファクトリクラスです。「properties」属性を使用して、装飾されたehcacheを任意の方法で設定できます。ここでは、nameプロパティのみを使用して、新しい装飾されたehcacheの名前を構成します。他のすべての操作は、基盤となるキャッシュに委任できます。

ここでこのユースケースで機能するカスタムキャッシュデコレータを1つ提供すると、ehcache jarに含まれるEhcacheDecoratorAdapterを再利用し、getName()をオーバーライドするだけです。EhcacheDecoratorAdapterは、コンストラクターで渡す基になるehcacheにすべての操作を委任します。

パッケージcom.xyz.util;

インポートjava.util.Properties;

インポートnet.sf.ehcache.Ehcache;
インポートnet.sf.ehcache.constructs.CacheDecoratorFactory;
インポートnet.sf.ehcache.constructs.EhcacheDecoratorAdapter;

パブリッククラスCustomEhcacheDecoratorFactoryはCacheDecoratorFactoryを拡張します{

    public Ehcache createDecoratedEhcache(final Ehcache cache、
            最終的なプロパティプロパティ){
        新しいEhcacheDecoratorAdapter(cache){を返します
            プライベート最終文字列名=properties.getProperty( "name");

            public String getName(){
                戻り名;
            }
        };
    }

    public Ehcache createDefaultDecoratedEhcache(final Ehcache cache、
            最終的なプロパティプロパティ){
        新しいEhcacheDecoratorAdapter(cache){を返します
            プライベート最終文字列名=properties.getProperty( "name");

            public String getName(){
                戻り名;
            }
        };
    }
}

于 2010-12-22T11:40:58.573 に答える