4

この春/休止状態のプロジェクトがあり、ehcacheとテラコッタを介して休止状態に第2レベルのキャッシュを追加しようとしています。すべてが正常にプラグインされているようです。テラコッタコンソールで、キャッシュしようとしているエンティティのエントリを確認することもできます。しかし、統計とDBからのログに基づくと、何もキャッシュされていません。

負荷ヒット率は0%で、負荷統計も0です。私が間違っているのは何ですか?

これが私がしたことです。Mavenを介して必要なjarファイルを追加しました。

        <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-core</artifactId>
                <version>2.5.2</version>
        </dependency>
        <dependency>
                <groupId>net.sf.ehcache</groupId>
                <artifactId>ehcache-terracotta</artifactId>
                <version>2.5.2</version>
        </dependency>
        <dependency>
                <groupId>org.terracotta</groupId>
                <artifactId>terracotta-toolkit-1.5-runtime</artifactId>
                <version>4.2.0</version>
        </dependency>

2次キャッシュを有効にするためにHibernateプロパティを変更しました

<property name="hibernateProperties">
            <props>
                ...
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
                <prop key="hibernate.cache.use_query_cache">true</prop>
                <prop key="hibernate.cache.use_structured_entries">true</prop>
                <prop key="hibernate.cache.generate_statistics">true</prop>
            </props>
        </property>

テストエンティティに@Cacheアノテーションを追加しました

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User implements java.io.Serializable
 {
...
}

これが私の非常に単純なehcache.xmlです(同じ結果でエンティティのキ​​ャッシュエントリを設定しようとしました)

<?xml version="1.0" encoding="UTF-8"?>
<ehcache >    
    <defaultCache  
        maxElementsInMemory="10000"   
        eternal="false" 
        maxEntriesLocalHeap="10"         
        timeToIdleSeconds="120"         
        timeToLiveSeconds="120">        
        <terracotta/>    
    </defaultCache>        
    <terracottaConfig         
        url="localhost:9510"/>
</ehcache>

テラコッタサーバーを起動してテストコードを実行した後

@Test
    @Transactional
    @Rollback(false)
    public void testCache() {
        long start = System.currentTimeMillis();
        List<User> list = userRepository.listAll(0, 100);
        long end = System.currentTimeMillis();
        log.info("Total time "+(end-start));
        assertNotNull(list);
        assertThat(list.size(), is(100));

        for (int i=0; i<100; i++) {
            long start2 = System.currentTimeMillis();
            list = userRepository.listAll(0, 100);
            long end2 = System.currentTimeMillis();
            log.info("Total time 2 "+(end2-start2));
        }
        assertNotNull(list);
        assertThat(list.size(), is(100));
    }

私のログには、発生してはならない100のSQLが表示されます。また、ヒット率は0%と表示されます。

これが私のテストの実行中のテラコッタコンソールからのスクリーンショットです。

これを機能させるために必要な最後のピースは何ですか?

第2レベルのキャッシュ統計 ehcacheの概要 エンティティ統計

4

1 に答える 1

3

私が実験していた問題の解決策を見つけました。詳細は次のとおりです。

  • Hibernateプロパティのキーが間違っているため、統計が設定されていませんでした

これを使用します( .cacheがないことに注意してください) 。

<prop key="hibernate.generate_statistics">true</prop>

それ以外の

<prop key="hibernate.cache.generate_statistics">true</prop>
  • エンティティの一覧表示/読み込みを担当するメソッドに「.setCachable(true)」を使用していなかったため、クエリがキャッシュされませんでした。
于 2012-05-16T12:58:48.113 に答える