0

クエリ キャッシュを使用するようにアプリを構成しました。

休止状態の設定:

hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
hibernate.cache.use_query_cache=true

EHCache 構成:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false" monitoring="autodetect" dynamicConfig="false">
    <defaultCache
        maxEntriesLocalHeap="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        maxEntriesLocalDisk="10000000"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    <cache name="query.Dictionary.CountriesList"
        maxEntriesLocalHeap="10000" 
        maxEntriesLocalDisk="1000"
        eternal="false"
        timeToLiveSeconds="86400">
        <persistence strategy="localTempSwap" />
    </cache>
</ehcache>

ダオ:

Criteria query = session.createCriteria(DictionaryCountry.class)
                .setCacheable(true)
                .setCacheRegion("query.Dictionary.CountriesList")
                .addOrder(Order.asc("name"));

ここで、初めて国のリストを入力しようとすると、標準クエリが作成され(select * from ... where ... )ます。しかし、2回目に実行すると、キャッシュから取得する代わりに、アプリはid sqlクエリで多くのgetを実行し(select * from ... where id = ? )ます...

それは正常な動作ですか?

ありがとうございました

4

2 に答える 2

0

はい、クエリ キャッシュには 2 次キャッシュが必要です。これは私の構成です:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_query_cache">true</property><code>
<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</property>
<property name="hibernate.cache.use_structured_entries">true</property>
<property name="hibernate.generate_statistics">true</property>

そして、データベースへの複数のクエリに関して、私が見つけた本当のバグはここにありました

var1 = 1 および var2 = 20 の場合。

List<entity> objects = session.createCriteria(entity.class)  
                              .add(Restrictions.between("price",var1,var2))
                              .setCacheable(true)
                              .list();

問題は、これらのオブジェクトが前のクエリから既にキャッシュされているため、後続のクエリvar1 = 21を実行した場合、ehcache はキャッシュから取得するほどスマートではありません。var2 = 40

あるクエリの動的パラメーターに問題があったため、クエリが常に異なるため、2 番目のレベルのキャッシュにヒットすることはありませんでした。同じパラメーターが必要です。

これが私の経験だったので、それが役に立てば幸いです。

于 2014-01-17T21:41:08.677 に答える