Hibernate (with Spring support)
Exposing Hibernate statistics with JMX is pretty simple, however some nasty workarounds are requires when JPA API is used to obtain underlyingSessionFactoryclass JmxLocalContainerEntityManagerFactoryBean() extends LocalContainerEntityManagerFactoryBean {
override def createNativeEntityManagerFactory() = {
val managerFactory = super.createNativeEntityManagerFactory()
registerStatisticsMBean(managerFactory)
managerFactory
}
def registerStatisticsMBean(managerFactory: EntityManagerFactory) {
managerFactory match {
case impl: EntityManagerFactoryImpl =>
val mBean = new StatisticsService();
mBean.setStatisticsEnabled(true)
mBean.setSessionFactory(impl.getSessionFactory);
val name = new ObjectName("org.hibernate:type=Statistics,application=spring-pitfalls")
ManagementFactory.getPlatformMBeanServer.registerMBean(mBean, name);
case _ =>
}
}
}
Note that I have created a subclass of Springs built-in LocalContainerEntityManagerFactoryBean. By overriding createNativeEntityManagerFactory() method I can access EntityManagerFactory and by trying to downcast it to org.hibernate.ejb.EntityManagerFactoryImpl we were able to register Hibernate Mbean.One more thing has left. Obviously we have to use our custom subclass instead of
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean. Also, in order to collect the actual statistics instead of just seeing zeroes all the way down we must set the hibernate.generate_statistics flag.@Bean
def entityManagerFactoryBean() = {
val entityManagerFactoryBean = new JmxLocalContainerEntityManagerFactoryBean()
entityManagerFactoryBean.setDataSource(dataSource())
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter())
entityManagerFactoryBean.setPackagesToScan("com.blogspot.nurkiewicz")
entityManagerFactoryBean.setJpaPropertyMap(
Map(
"hibernate.hbm2ddl.auto" -> "create",
"hibernate.format_sql" -> "true",
"hibernate.ejb.naming_strategy" -> classOf[ImprovedNamingStrategy].getName,
"hibernate.generate_statistics" -> true.toString
).asJava
)
entityManagerFactoryBean
}
Here is a sample of what can we expect to see in JvisualVM (don't forget to install all plugins!):







