2014-05-02 240 views
3

我努力配置hibernate jmx,以便通过hibernate jconsole插件获得一些指标。休眠jconsole弹簧配置

其实我也跟着从休眠状态的JConsole插件的官方网站的配置:http://hibernate-jcons.sourceforge.net/usage.html#pre-requisites

,但它不工作,所以我搜索互联网上几个小时,测试的东西。唯一相关的事情,我发现,与我的问题,就是:How to configure Hibernate statistics in Spring 3.0 application?

,但它仍然无法正常工作。我需要你的帮助。

这里是配置:

@PersistenceContext(unitName = DomainConstants.JPA_PU_BACKEND) 
private EntityManager em; 

@Bean(name="jmxExporter") 
public MBeanExporter jmxExporter() throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException { 
    MBeanExporter exporter = new MBeanExporter(); 
    Map<String, Object> beans = new HashMap<String, Object>(); 
    beans.put("Hibernate:application=Statistics", "hibernateStatisticsBean"); 
    MBeanServerFactoryBean serverFactory = new MBeanServerFactoryBean(); 
    serverFactory.setLocateExistingServerIfPossible(true); 
    // --- new1 
    MBeanServer MBeanServer = serverFactory.getObject(); 
    exporter.setServer(MBeanServer); 
    exporter.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING); 
    // end -- new1 
    exporter.setBeans(beans); 
    return exporter; 
} 


@Bean(name="hibernateStatisticsBean") 
public StatisticsService hibernateStatisticsBean() { 
    StatisticsService service = new StatisticsService(); 
    service.setStatisticsEnabled(true); 
    service.setSessionFactory(((Session)em.getDelegate()).getSessionFactory()); 
    return service; 
} 

我还设置hibernate.generate_statistics为true,Hibernate配置。

我被卡住了。我真的需要这个工具来工作,因为我们的查询花费了很多时间。这个工具将是完美的。

编辑: 的的MBean似乎被加载。当我做查询时,属性会改变。 image2 http://imageshack.com/a/img838/5904/dj8c.png

但是,当我试图调用操作之一:getQueryStatistics,getCollectionStatistics等。我得到以下错误: image1 http://imageshack.com/a/img838/9693/ibkd.png

而实际上我不知道查询统计,没有任何显示: image3 http://imageshack.com/a/img835/8088/laoz.png

+0

尝试直接设置的bean引用,而不是它的名字:'beans.put(“休眠:应用=统计” ,hibernateStatisticsBean())'。 –

+0

谢谢安德烈的帮助。我试过你的解决方案,但它并没有改变任何东西。 –

+0

当你说它不起作用时,这是什么意思? MBean不会显示在JMX中,您可以连接到JMX服务器等?你可以发布一些日志吗? –

回答

1

我知道这个帖子是两岁,但我想在其他人已经遇到麻烦的Hibernate插件的JConsole与最新的Spring和Hibernate工作的情况下分享。

我的环境是Java的8,春季启动1.4.0(春季4.3.2和5.0.9的Hibernate)。

我想,人们提到的Hibernate 4.3为他们工作的几个不同的东西,但他们并没有为我工作。最后,我决定从我在Hibernate功能请求论坛中找到的其他人那里得到一些建议(要求为Hibernate统计信息带回JMX支持),他们建议从Hibernate 3.2.7中抓取旧的StatisticsServiceMBean。

我更新了MBean并用它来包裹从休眠5使用JMX注释统计对象,当然,它的工作。

所以你不必键入这一切,那就是:

import javax.persistence.EntityManagerFactory; 
import javax.servlet.ServletContext; 

import org.hibernate.jpa.HibernateEntityManagerFactory; 
import org.hibernate.SessionFactory; 
import org.hibernate.stat.CollectionStatistics; 
import org.hibernate.stat.EntityStatistics; 
import org.hibernate.stat.QueryStatistics; 
import org.hibernate.stat.SecondLevelCacheStatistics; 
import org.hibernate.stat.Statistics; 
import org.springframework.beans.factory.InitializingBean; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.jmx.export.annotation.ManagedAttribute; 
import org.springframework.jmx.export.annotation.ManagedOperation; 
import org.springframework.jmx.export.annotation.ManagedResource; 
import org.springframework.stereotype.Component; 
import org.springframework.web.context.WebApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

@Component 
@ManagedResource("Hibernate:application=Statistics") 
public class HibernateStatisticsMBean implements InitializingBean { 

    @Autowired 
    private ServletContext servletContext; 

    private Statistics stats; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
     EntityManagerFactory emf = (EntityManagerFactory) wac.getBean("entityManagerFactory"); 
     SessionFactory sessionFactory = ((HibernateEntityManagerFactory) emf).getSessionFactory(); 
     sessionFactory.getStatistics().setStatisticsEnabled(true); 
     this.stats = sessionFactory.getStatistics(); 
    } 

    @ManagedOperation 
    public void clear() { 
     stats.clear(); 
    } 

    @ManagedOperation 
    public EntityStatistics getEntityStatistics(String entityName) { 
     return stats.getEntityStatistics(entityName); 
    } 

    @ManagedOperation 
    public CollectionStatistics getCollectionStatistics(String role) { 
     return stats.getCollectionStatistics(role); 
    } 

    @ManagedOperation 
    public SecondLevelCacheStatistics getSecondLevelCacheStatistics(String regionName) { 
     return stats.getSecondLevelCacheStatistics(regionName); 
    } 

    @ManagedOperation 
    public QueryStatistics getQueryStatistics(String hql) { 
     return stats.getQueryStatistics(hql); 
    } 

    @ManagedAttribute 
    public long getEntityDeleteCount() { 
     return stats.getEntityDeleteCount(); 
    } 

    @ManagedAttribute 
    public long getEntityInsertCount() { 
     return stats.getEntityInsertCount(); 
    } 

    @ManagedAttribute 
    public long getEntityLoadCount() { 
     return stats.getEntityLoadCount(); 
    } 

    @ManagedAttribute 
    public long getEntityFetchCount() { 
     return stats.getEntityFetchCount(); 
    } 

    @ManagedAttribute 
    public long getEntityUpdateCount() { 
     return stats.getEntityUpdateCount(); 
    } 

    @ManagedAttribute 
    public long getQueryExecutionCount() { 
     return stats.getQueryExecutionCount(); 
    } 

    @ManagedAttribute 
    public long getQueryCacheHitCount() { 
     return stats.getQueryCacheHitCount(); 
    } 

    @ManagedAttribute 
    public long getQueryExecutionMaxTime() { 
     return stats.getQueryExecutionMaxTime(); 
    } 

    @ManagedAttribute 
    public long getQueryCacheMissCount() { 
     return stats.getQueryCacheMissCount(); 
    } 

    @ManagedAttribute 
    public long getQueryCachePutCount() { 
     return stats.getQueryCachePutCount(); 
    } 

    @ManagedAttribute 
    public long getFlushCount() { 
     return stats.getFlushCount(); 
    } 

    @ManagedAttribute 
    public long getConnectCount() { 
     return stats.getConnectCount(); 
    } 

    @ManagedAttribute 
    public long getSecondLevelCacheHitCount() { 
     return stats.getSecondLevelCacheHitCount(); 
    } 

    @ManagedAttribute 
    public long getSecondLevelCacheMissCount() { 
     return stats.getSecondLevelCacheMissCount(); 
    } 

    @ManagedAttribute 
    public long getSecondLevelCachePutCount() { 
     return stats.getSecondLevelCachePutCount(); 
    } 

    @ManagedAttribute 
    public long getSessionCloseCount() { 
     return stats.getSessionCloseCount(); 
    } 

    @ManagedAttribute 
    public long getSessionOpenCount() { 
     return stats.getSessionOpenCount(); 
    } 

    @ManagedAttribute 
    public long getCollectionLoadCount() { 
     return stats.getCollectionLoadCount(); 
    } 

    @ManagedAttribute 
    public long getCollectionFetchCount() { 
     return stats.getCollectionFetchCount(); 
    } 

    @ManagedAttribute 
    public long getCollectionUpdateCount() { 
     return stats.getCollectionUpdateCount(); 
    } 

    @ManagedAttribute 
    public long getCollectionRemoveCount() { 
     return stats.getCollectionRemoveCount(); 
    } 

    @ManagedAttribute 
    public long getCollectionRecreateCount() { 
     return stats.getCollectionRecreateCount(); 
    } 

    @ManagedAttribute 
    public long getStartTime() { 
     return stats.getStartTime(); 
    } 

    @ManagedAttribute 
    public boolean isStatisticsEnabled() { 
     return stats.isStatisticsEnabled(); 
    } 

    @ManagedOperation 
    public void setStatisticsEnabled(boolean enable) { 
     stats.setStatisticsEnabled(enable); 
    } 

    @ManagedOperation 
    public void logSummary() { 
     stats.logSummary(); 
    } 

    @ManagedAttribute 
    public String[] getCollectionRoleNames() { 
     return stats.getCollectionRoleNames(); 
    } 

    @ManagedAttribute 
    public String[] getEntityNames() { 
     return stats.getEntityNames(); 
    } 

    @ManagedAttribute 
    public String[] getQueries() { 
     return stats.getQueries(); 
    } 

    @ManagedAttribute 
    public String[] getSecondLevelCacheRegionNames() { 
     return stats.getSecondLevelCacheRegionNames(); 
    } 

    @ManagedAttribute 
    public long getSuccessfulTransactionCount() { 
     return stats.getSuccessfulTransactionCount(); 
    } 

    @ManagedAttribute 
    public long getTransactionCount() { 
     return stats.getTransactionCount(); 
    } 

    @ManagedAttribute 
    public long getCloseStatementCount() { 
     return stats.getCloseStatementCount(); 
    } 

    @ManagedAttribute 
    public long getPrepareStatementCount() { 
     return stats.getPrepareStatementCount(); 
    } 

    @ManagedAttribute 
    public long getOptimisticFailureCount() { 
     return stats.getOptimisticFailureCount(); 
    } 

    @ManagedAttribute 
    public String getQueryExecutionMaxTimeQueryString() { 
     return stats.getQueryExecutionMaxTimeQueryString(); 
    } 

}