Spring 4.3.7+Hibernate 5.2.x+EhCache 3.3.1 JMX统计配置及jconsole使用求助
解决Hibernate 5.2 JMX缓存统计查看问题
嗨,针对你遇到的这两个问题,我给你整理了可行的解决方案和原因分析:
一、解决StatisticsService抽象类无法实例化的问题
在Hibernate 5.2及以后的版本中,StatisticsService确实被改成了抽象类,官方推荐使用它的实现类org.hibernate.stat.spi.StandardStatisticsService来暴露JMX统计服务。下面给你两种Spring环境下的配置方式:
1. XML配置方式(适合Spring XML项目)
在你的Spring配置文件中添加以下bean定义:
<bean id="hibernateStatisticsService" class="org.hibernate.stat.spi.StandardStatisticsService"> <property name="sessionFactory" ref="sessionFactory"/> <property name="statisticsEnabled" value="true"/> </bean> <bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="beans"> <map> <entry key="org.hibernate:type=Statistics,name=HibernateStatistics" value-ref="hibernateStatisticsService"/> </map> </property> </bean>
这里的sessionFactory要对应你项目中实际的SessionFactory bean名称,配置后Spring会自动把统计服务注册到JMX中。
2. Java配置方式(适合Spring Boot或JavaConfig项目)
如果你的项目用JavaConfig,可以这样写:
import org.hibernate.stat.spi.StandardStatisticsService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jmx.export.MBeanExporter; import org.springframework.jmx.export.naming.IdentityNamingStrategy; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceUnit; import java.util.HashMap; import java.util.Map; @Configuration public class HibernateJmxConfig { @PersistenceUnit private EntityManagerFactory entityManagerFactory; @Bean public StandardStatisticsService hibernateStatisticsService() { StandardStatisticsService statisticsService = new StandardStatisticsService(); statisticsService.setSessionFactory(entityManagerFactory.unwrap(org.hibernate.SessionFactory.class)); statisticsService.setStatisticsEnabled(true); return statisticsService; } @Bean public MBeanExporter mbeanExporter() { MBeanExporter exporter = new MBeanExporter(); exporter.setNamingStrategy(new IdentityNamingStrategy()); Map<String, Object> beans = new HashMap<>(); beans.put("org.hibernate:type=Statistics,name=HibernateStatistics", hibernateStatisticsService()); exporter.setBeans(beans); return exporter; } }
这段代码会从EntityManagerFactory中解包出Hibernate的SessionFactory,然后绑定到StandardStatisticsService上,再通过MBeanExporter注册到JMX。
二、hibernate-jconsole-1.0.7.jar运行无反应的原因
这个jar运行没反应主要有两个核心原因:
- 版本兼容性问题:
hibernate-jconsole-1.0.7.jar是适配Hibernate 4.x及更早版本的工具,和你用的Hibernate 5.2.x完全不兼容。Hibernate 5之后,JMX统计的实现方式已经重构,这个老版本的jar无法识别新的Hibernate统计API,自然启动后没有任何效果。 - 运行依赖缺失:即使是在兼容版本中,这个jar也需要依赖Hibernate的核心jar、JMX相关jar才能正常运行,直接双击或者用
java -jar运行时,类路径中没有这些依赖,导致它无法加载必要的类,静默失败(没有报错输出是因为没有配置错误日志)。
另外,Hibernate 5之后官方已经不再推荐使用这个独立的jconsole jar,而是直接通过内置的JMX支持来暴露统计信息,也就是我们上面配置的StandardStatisticsService方式。
三、验证配置是否生效
配置完成后,启动你的应用,然后打开jconsole:
- 运行
jconsole命令(确保Java环境变量配置正确) - 在连接界面选择你的应用进程,点击连接
- 切换到"MBeans"标签页,找到
org.hibernate->Statistics->HibernateStatistics - 在这里你可以看到所有的缓存统计数据,比如二级缓存的命中数、miss数、查询缓存的统计等
内容的提问来源于stack exchange,提问作者greengold
相关产品推荐
相关产品推荐

