现在我想通过ehache使用JPA二级缓存。我做了一些配置,似乎工作。但我仍然可以看到查询sql。我不确定ehcache是否有效。有人知道吗?感谢。
1.some part of persistence.xml
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<property name="hibernate.cache.provider_configuration" value="/ehcache.xml" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.show_sql" value="true" />
2.ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<defaultCache maxElementsInMemory="1" eternal="false"
timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="true" clearOnFlush="true">
</defaultCache>
<cache name="org.test.persistent.entity.Scenario"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
overflowToDisk="true">
</cache>
<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxElementsInMemory="10000"
timeToIdleSeconds="1800"
timeToLiveSeconds="3600"
eternal="false">
</cache>
</ehcache>
3. sql
TypedQuery<Scenario> query = em.createQuery(
"from Scenario as s where s.obsolete!=1 and s.parentId=? order by s.name, s.scenarioStatusId",
Scenario.class);
query.setParameter(1, parentId);
query.setHint("org.hibernate.cacheable", true);
List<Scenario> scenarios = null;
org.hibernate.Query hbQuery = null;
if (query instanceof org.hibernate.ejb.QueryImpl) {
hbQuery = ((org.hibernate.ejb.QueryImpl)query).getHibernateQuery();
hbQuery.setCacheable(true);
scenarios = hbQuery.list();
} else {
scenarios = query.getResultList();
}
答案 0 :(得分:0)
Ehcache设置的默认值为maxElementsInMemory =&#34; 10000&#34;。它必须根据命中进行调整。
执行此操作的一种方法是,您可以增加maxElementsInMemory并检查是否要通过&#34;试用和错误&#34;来解决此问题。方法
其他方式(可靠)是您必须发布Mbeans并在JConsole中监视缓存使用和缓存未命中。根据报告,您可以增加&#39; maxElementsInMemory&#39;。请参考http://hibernate-jcons.sourceforge.net/usage.html
中的方法答案 1 :(得分:-1)
我通过添加&#34;&#34;将缓存数据写入磁盘。它似乎运作良好,我在目录中找到一些数据。但我仍然没有找到为什么它仍然执行sql的原因。