我在Wildfly 8.2上使用Spring Data JPA,Hibernate 4.3.10.Final,Ehcache。我想测试应用程序服务器如何处理缓存中的所有数据。
问题是:默认情况下是否可以为所有扫描的实体启用二级缓存?
实际上,我想避免在每个实体上添加@Cache
(因为项目有100 +)。
JPA属性
... data source definition ...
<property name="sharedCacheMode" value="ALL" />
Hibernate属性
<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行,这是正确的。但我看到41 L2C puts
2次,不应该41 L2C puts
然后是41 L2C hits
吗?
答案 0 :(得分:2)
是的,如上所述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)
注释某些实体。