为所有实体启用 Ehcache

Enable Ehcache for all entities

我正在使用 Spring Data JPA、Hibernate 4.3。10.Final、Wildfly 8.2 上的 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>

编辑: 按照 Dragan Bozanovic 的建议尝试了 <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 行,这是正确的。但是我看到了2次41 L2C puts,不应该是41 L2C puts然后是41 L2C hits吗?

是的,如所述here,添加到您的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) 注释这些实体。