spring – 如何从实体管理器访问Hibernate统计信息?
作者:互联网
我使用的是Spring 3.1.1.RELEASE,JUnit 4.8.1和Hibernate 4.1.5.Final.我正在尝试测试我的二级缓存是否配置正确,但我不确定如何做到这一点.我正在使用JPA实体管理器,在Spring中配置如此……
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaDialect">
<bean class="org.collegeboard.springboard.core.jpa.HibernateJpaDialect">
<property name="flushMode" value="COMMIT"/>
</bean>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="persistenceXmlLocation" value="classpath:META-INF/test-persistence.xml"/>
<property name="persistenceUnitName" value="orgTestingDatabase"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sharedEntityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
我已经配置了我的二级缓存…
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- Collect stats, this is for testing if the cache is working -->
<property name="hibernate.generate_statistics">true</property>
如何在给定javax.persistence.EntityManager的情况下访问org.hibernate.stat.Statistics对象?显然,我需要以某种方式访问SessionFactory,但我无法找出适当的强制转换系列.
谢谢, – 戴夫
解决方法:
我过去一直在努力解决这个问题:Exposing Hibernate (cache) statistics through JMX with Spring in Tomcat
如果您只是想知道“它是否正常工作”,您可以为org.hibernate.stat.Statistics或org.hibernate.stat.*启用Hibernate调试日志记录.但是,如果您(像我)想要一个缓存统计报告,您可以执行以下操作.这会公开一个包含所有统计信息的JMX bean:
/**
* Provides code to register Hibernate's 2nd level cache statistics bean with a
* JMX MBean server. Assumes that both the MBeanServer and the
* EntityManagerFactory are available as Spring-managed beans. Note that while
* registering this class enables the collection of statistics even if that was
* previously disabled.
*/
public class HibernateCacheStatisticsJmxRegistration {
@Autowired
private EntityManagerFactory entityManagerFactory;
@Autowired
private MBeanServer mbeanServer;
private ObjectName objectName;
/**
* Registers the statistics MBean that wraps a Hibernate session factory.
*
* @throws JMException if anything fails..
* @see HibernateCacheStatisticsJmxRegistration#unregister()
*/
public void register() throws JMException {
final SessionFactory sessionFactory = ((HibernateEntityManagerFactory) entityManagerFactory).getSessionFactory();
objectName = new ObjectName("net.sf.ehcache:type=CacheStatistics,name=Hibernate2ndLevelCache");
final StatisticsService statsMBean = new StatisticsService();
statsMBean.setSessionFactory(sessionFactory);
statsMBean.setStatisticsEnabled(true);
mbeanServer.registerMBean(statsMBean, objectName);
}
/**
* Unregisters the MBean that was registered.
*
* @throws JMException if the de-registration fails
* @see HibernateCacheStatisticsJmxRegistration#register()
*/
public void unregister() throws JMException {
mbeanServer.unregisterMBean(objectName);
}
}
应用上下文:
<!-- Setting up Ehcache manager for various caches. -->
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
</bean>
<ehcache:annotation-driven cache-manager="ehCacheManager" />
<!-- Exposing cache statistics through JMX. -->
<context:mbean-server />
<bean class="net.sf.ehcache.management.ManagementService" init-method="init">
<constructor-arg ref="ehCacheManager"/>
<constructor-arg ref="mbeanServer"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
<constructor-arg value="true"/>
</bean>
<bean class="HibernateCacheStatisticsJmxRegistration" init-method="register" destroy-method="unregister" />
标签:spring,junit,hibernate,sessionfactory,second-level-cache 来源: https://codeday.me/bug/20190729/1569717.html