[英]EHCache doesn't seem to work
我已經在使用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" />
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>
關於如何填充緩存的任何想法? 謝謝。
通常,這些項目會由Hibernate自動填充到緩存中。
我在您的配置中注意到的一件事是您沒有啟用統計信息。 添加屬性
hibernate.generate_statistics=true
到會話工廠的配置,然后查看輸出中是否出現數字。
是的,當您在hibernate中使用第二個緩存時,要進行查詢時,必須這樣設置:
Query q=....
q.setCacheable(tre);
如果你是春天,你必須這樣寫
getHibernateTemplate().setCacheQueries(true);
嘗試使用net.sf.ehcache.hibernate.SingletonEhCacheProvider代替net.sf.ehcache.hibernate.EhCacheProvider
首先,您確定ActionItem
的緩存使用情況應該是read-only
嗎? 這些項目最初是如何填充的? 而且,即使這對您的業務模型是正確的,也可以考慮將其更改為nonstrict-read-write
,以查看它在測試中是否有任何更改。
然后,您是否嘗試在啟用緩存的情況下執行byResourceUniqueName
查詢:
Query q = getSession().getNamedQuery("byResourceUniqueName");
q.setCacheable(true);
List result = q.list();
即使cacheable
參數僅影響查詢結果集的緩存,請再次查看其是否有任何變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.