我在我们的Java应用程序上设置了ehcache,它使用Spring和Hibernate。 但是,当我运行Junit测试并打印统计数据时,缓存中似乎没有任何内容:
每个CACHE的CACHE MANAGER 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
映射文件的内容(仅限部分,大到全部):
<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>
有关如何填充缓存的任何想法? 感谢。
答案 0 :(得分:2)
通常,Hibernate会自动将项填充到缓存中。
我在配置中注意到的一件事是您没有启用统计信息。添加属性
hibernate.generate_statistics=true
到会话工厂的配置,看看输出中是否有数字。
答案 1 :(得分:1)
是的,当你在hibernate中使用第二个缓存时,当你要查询时你必须这样设置:
Query q=....
q.setCacheable(tre);
如果你是春天,你必须这样写
getHibernateTemplate().setCacheQueries(true);
答案 2 :(得分:0)
首先,您确定ActionItem
的缓存使用量应为read-only
吗?这些项目最初是如何填充的?而且,即使这对您的商业模式而言是正确的,也可以考虑将其更改为nonstrict-read-write
,以查看它是否会改变您测试中的任何内容。
然后,您是否尝试在启用缓存的情况下执行byResourceUniqueName
查询:
Query q = getSession().getNamedQuery("byResourceUniqueName");
q.setCacheable(true);
List result = q.list();
即使cacheable
参数应该只影响查询结果集的缓存,再次查看它是否会发生任何变化。
答案 3 :(得分:0)
尝试使用net.sf.ehcache.hibernate.SingletonEhCacheProvider而不是net.sf.ehcache.hibernate.EhCacheProvider