为所有实体启用Ehcache



我在Wildfly 8.2上使用Spring Data JPA、Hibernate 4.3.10.Final、Ehcache。我想测试应用程序服务器如何处理缓存中的所有数据。

问题是:是否可以默认为所有扫描的实体启用二级缓存?

实际上,我想避免在每个实体上添加@Cache(因为项目有100+)。

JPA属性

... data source definition ...
<property name="sharedCacheMode" value="ALL" />

休眠属性

<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">/ehcache.xml</prop>

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="true"
         monitoring="autodetect"
         dynamicConfig="true">
    <diskStore path="java.io.tmpdir/ehcache" />
    <defaultCache maxElementsInMemory="1000000000"
                  eternal="true"
                  overflowToDisk="false"
                  diskPersistent="false"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU"
                  statistics="true"
                  >
    </defaultCache>
    <!-- 
    <cache name="org.hibernate.cache.internal.StandardQueryCache"
            eternal="false"
            timeToLiveSeconds="120">
            <persistence strategy="localTempSwap"/>
    </cache> -->
</ehcache>

编辑:按照德拉甘·博扎诺维奇的建议尝试了<prop key="javax.persistence.sharedCache.mode">ALL</prop>,但这并不影响过程。

以下是SELECT e FROM MyEntity e执行2次的统计日志:

17:00:00,597 | INFO  | StatisticalLoggingSessionE:275  |  | Session Metrics {
    71157 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    145393 nanoseconds spent preparing 1 JDBC statements;
    386233 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    822075 nanoseconds spent performing 41 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}
17:00:00,597 | INFO  | StatisticalLoggingSessionE:275  |  | Session Metrics {
    63973 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    127262 nanoseconds spent preparing 1 JDBC statements;
    282918 nanoseconds spent executing 1 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    452598 nanoseconds spent performing 41 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    0 nanoseconds spent executing 0 flushes (flushing a total of 0 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}

返回了41行,这是正确的。但我看了41 L2C puts两次,不应该是41 L2C puts然后是41 L2C hits吗?

是的,如上所述,添加到您的persistence.xml:

<shared-cache-mode>ALL</shared-cache-mode>

如果没有通过persistence.xml配置Hibernate,请在javax.persistence.sharedCache.mode配置属性中设置所需的值。

然而,您可能希望使用实现相同的效果

<shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>

这样,如果以后决定关闭某些实体的缓存,就可以使用@Cacheable(false)对它们进行注释。

最新更新