0

Spring と Hibernate を使用する Java アプリケーションに ehcache をセットアップしました。ただし、Junit テストを実行して統計を出力すると、キャッシュに何もないように見えます。

すべてのキャッシュのキャッシュ マネージャー統計の出力:

COM.****.SERVICES.CLARITY.DOMAIN.ACTIONITEM.BYRESOURCEUNIQUENAME: getCacheHits: 0 getCacheMisses: 0 getObjectCount: 0

COM.****.SERVICES.CLARITY.DOMAIN.ACTIONITEM: getCacheHits: 0 getCacheMisses: 0 getObjectCount: 0

COM.****.SERVICES.CLARITY.DOMAIN.RESOURCE: getCacheHits: 0 getCacheMisses: 0 getObjectCount: 0

マッピング ファイルの内容 (パーツのみ、大きすぎてすべてを貼り付けられません):

<class name="ActionItem" table="CAL_ACTION_ITEMS" mutable="false" lazy="false" >
<cache region="com.****.services.clarity.domain.ActionItem" usage="read-only" include="all" />

[...]

<query name="byResourceUniqueName" cacheable="true" cache-region="com.****.services.clarity.domain.ActionItem.byResourceUniqueName" read-only="true">
    FROM ActionItem WHERE id IN (
        SELECT DISTINCT actionItemId FROM ActionItemAssignee as aia WHERE assigneeId IN (
            SELECT userId FROM Resource WHERE uniqueName = :uniqueName
        )
    )
    ORDER BY dueDate
</query>

EHCACHE.XML の内容:

<cache
    name="com.****.services.clarity.domain.ActionItem"
    maxElementsInMemory="2000" eternal="false" timeToIdleSeconds="0"
    timeToLiveSeconds="600" overflowToDisk="false" />

<cache
    name="com.****.services.clarity.domain.ActionItem.byResourceUniqueName"
    maxElementsInMemory="2000" eternal="false" timeToIdleSeconds="0"
    timeToLiveSeconds="60" overflowToDisk="false" />

<defaultCache maxElementsInMemory="200" eternal="false"
    timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
    memoryStoreEvictionPolicy="LRU" />

ハイバネート設定:

    <property name="hibernateProperties">
        <value>
            hibernate.format_sql=true
            hibernate.dialect=org.hibernate.dialect.OracleDialect
            hibernate.cache.provider_class=net.sf.ehcache.hibernate.EhCacheProvider
            hibernate.cache.use_query_cache=true
            hibernate.show_sql=true
        </value>
    </property>
</bean>

キャッシュを作成する方法についてのアイデアはありますか? ありがとう。

4

4 に答える 4

2

通常、項目は Hibernate によって自動的にキャッシュに取り込まれます。

構成で気づいたことの 1 つは、統計を有効にしていないことです。プロパティを追加する

hibernate.generate_statistics=true

セッションファクトリの構成に追加し、出力に数字が含まれているかどうかを確認します。

于 2009-05-08T09:22:08.330 に答える
1

ええ、hibernate で 2 番目のキャッシュを使用する場合、クエリを実行するときは、次のように設定する必要があります。

Query q=....
q.setCacheable(tre);

あなたがSpringなら、このように書く必要があります

getHibernateTemplate().setCacheQueries(true);
于 2010-12-14T06:59:39.057 に答える
0

net.sf.ehcache.hibernate.EhCacheProvider の代わりに net.sf.ehcache.hibernate.SingletonEhCacheProvider を使用してみてください

于 2010-03-02T06:25:04.647 に答える
0

まず第一に、ActionItems のキャッシュ使用量はread-onlyですか? それらの項目は最初にどのように入力されますか? また、それがビジネス モデルに適している場合でも、 に変更することを検討してnonstrict-read-write、テストで何かが変わるかどうかを確認してください。

次に、byResourceUniqueNameキャッシュを有効にしてクエリを実行してみましたか:

Query q = getSession().getNamedQuery("byResourceUniqueName");
q.setCacheable(true);
List result = q.list();

パラメーターはクエリの結果セットのキャッシュにのみ影響するはずですがcacheable、ここでも、何かが変わるかどうかを確認してください。

于 2009-04-24T19:11:24.757 に答える