2009-04-24 217 views
0

我在我們的使用Spring和Hibernate的Java應用程序上設置了ehcache。 然而,當我運行JUnit測試,並打印統計數據,似乎沒有什麼緩存:EHCache似乎不起作用

ON EVERY CACHE緩存管理器STATS輸出:。

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

CONTENT映射文件(僅限零件,大到PASTE全部):

<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" /> 

HIBERNATE CONFIG:

<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> 

如何填充緩存任何想法? 謝謝。

回答

2

通常情況下,這些項目會通過Hibernate自動填充到緩存中。

我在配置中注意到的一件事是您沒有啓用統計信息。添加屬性

hibernate.generate_statistics=true 

到您的會話工廠的配置,看看,如果數字出現在您的輸出。

0

首先,你確定緩存使用率爲ActionItem s應該是read-only?那些項目最初是如何填充的?而且,即使這對您的商業模式是正確的,考慮將其更改爲nonstrict-read-write,以查看它是否會改變您測試中的任何內容。

那麼,你有沒有試過執行byResourceUniqueName查詢使用緩存啓用:

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

即使cacheable參數應該影響只緩存的查詢結果集的,再次,看它是否改變任何東西。

0

嘗試使用net.sf.ehcache.hibernate.SingletonEhCacheProvider而不是net.sf.ehcache.hibernate。EhCacheProvider

1

是啊,當你在使用休眠第二高速緩存中,當你將查詢你必須這樣設置:

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

如果你Spring,你必須這樣寫

getHibernateTemplate().setCacheQueries(true);