为所有实体启用 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)
注释这些实体。
我正在使用 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)
注释这些实体。