我已将Hibernate设置为使用EhCache进行实体的L2缓存。下面的Persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="..." transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
...
<properties>
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
<property name="hibernate.cache.use_second_level_cache"
value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.connection.autocommit" value="false" />
</properties>
</persistence-unit>
</persistence>
我使用了单例缓存提供程序,以便我可以在Spring中获取它的副本,并通过JMX公开EhCache管理对象:
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:shared="true" />
<bean id="managementService" class="net.sf.ehcache.management.ManagementService"
init-method="init"
destroy-method="dispose">
<constructor-arg ref="cacheManager"/>
<constructor-arg ref="mbeanServer"/>
<constructor-arg index="2" value="true"/>
<constructor-arg index="3" value="true"/>
<constructor-arg index="4" value="true"/>
<constructor-arg index="5" value="true"/>
</bean>
<bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true"/>
</bean>
我使用此方法公开Hibernate缓存统计信息:
MBeanServer mbs =
ManagementFactory.getPlatformMBeanServer();
ObjectName mxbeanName = new ObjectName("Project:type=EmfCacheStatistics");
StatisticsService statisticsService = new StatisticsService();
statisticsService.setSessionFactory(((HibernateEntityManagerFactory)emf).getSessionFactory());
statisticsService.setStatisticsEnabled(true);
mbs.registerMBean(statisticsService, mxbeanName);
最后,ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"
monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="300" timeToLiveSeconds="1800" overflowToDisk="true"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
现在,当我查看使用JMX的两个系统的统计数据时,我会得到非常不同的图片。注意,我重置了两组统计信息,然后在拍摄这些屏幕截图之前等了大约30秒。
第一个截图是EhCache。注意非常小的ObjectCount。这个值会波动,但绝不会高于~20
这是Hibernate缓存统计信息。他们看起来很对。
为什么缓存统计信息会报告如此截然不同的事情?它几乎看起来像EhCache统计数据根本不起作用。
我正在使用: - Hibernate 3.6.10 - EhCache 2.4.3 - 春季3.2.4
答案 0 :(得分:1)
相同的观察结果相同;)
默认情况下,EHCache上禁用统计信息;您需要将 statistics =&#34; true&#34; 添加到ehcache.xml中的缓存定义中。
示例:
<cache name="global" maxElementsInMemory="10" eternal="true" overflowToDisk="false" statistics="true" />