我已经进入休眠状态。generate_statistics=true和现在需要注册的mbean所以我可以看到的统计数据在jms控制台。我似乎无法得到任何地方,这似乎并不喜欢它应该是这样的一个困难的问题。也许是我让事情过于复杂的,但在任何情况下到目前为止,我已经试过:

  • 我复制EhCacheProvider并把它化的一个扩展版本的管理器,其重载init()以及称为ManagementService.registerMBeans(...)之后的初始化。代码都跑收到的实际调用registerMBeans(...),这将导致供应商初始化失败与一般性错误(不幸的是,我没有把它写下来.) 这种做法的动机是中使用的方法 这种产品网页上浏览的性能演练。
  • 我创造了自己的下列步骤:一个启动的方法,跑了类似的代码 这个例子的注册里的jms mbean.一切似乎能正常工作和我的下列步骤:显示在jms控制台,但没有对网。sf。里.
  • 因为我已经升级里1.5(我们使用1.3,不知道,如果特boss4.2.1或者只是一些我们选择了我们自己)和改变使用SingletonEhCacheProvider,并试图只手抓住的统计数据,而不是处理与下列步骤:注册。它还没有真正了任何更好;如果我呼叫getInstance()管理器,返回仅有的副本StandardQueryCache,但boss日志显示,许多其他的高速缓存已经被初始化(一个用于每个缓存的实体,在我们的申请。)

编辑:嗯,我已经想出了一件事...连接通过JConsole并揭示的统计数据mbean。我猜ManagementFactory.getPlatformMBeanServer()不会给你同样的下列步骤:服务器作为boss使用。无论如何,它看起来像我遇到一个类似的问题,因为当我试图收集的统计数据手动,因为我得到的所有零甚至后点击通过我的应用程序。

有帮助吗?

解决方案 2

解决。因为我没看到所有的高速缓存于我的实体,我怀疑我是不是得到正确的它的实例。我开始了这一行(见的例jms登记的代码链接我提供的问题):

SessionFactory sf = (new Configuration()).configure().buildSessionFactory();

最终的结果是缓存管理,我最终有了一个新的实例并不是一个自持久性上下文。所以我试图重构为:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
return ((EntityManagerFactoryImpl)emf).getSessionFactory();

但是,这只是举一个例外(我不记得确切的案文;一些效果,"不能初始持久性环境。") 所以没有其他选择,我增加了一个无国籍豆(UtilMgr)到我的应用程序,让持久性注射正确的它.这是豆:

import javax.ejb.Stateless;
import javax.persistence.PersistenceUnit;
import net.sf.ehcache.CacheManager;
import org.hibernate.SessionFactory;

@Stateless
public class UtilMgrBean implements UtilMgr {
    // NOTE: rename as necessary
    @PersistenceUnit(unitName = "myPersistenceCtx")
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return this.sessionFactory;
    }

    public CacheManager getCacheManager() {
        return CacheManager.getInstance(); // NOTE: assumes SingletonEhCacheProvider
    }
}

这里的修正码从前面提到的演练:

try {
    // NOTE: lookupBean is a utility method in our app we use for jndi lookups.
    //   replace as necessary for your application.
    UtilMgr utilMgr = (UtilMgr)Manager.lookupBean("UtilMgrBean", UtilMgr.class);
    SessionFactory sf = utilMgr.getSessionFactory();
    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

    // NOTE: replace myAppName as necessary
    ObjectName on = new ObjectName("Hibernate:type=statistics,application=myAppName");

    // Enable Hibernate JMX Statistics
    StatisticsService statsMBean = new StatisticsService();
    statsMBean.setSessionFactory(sf);
    statsMBean.setStatisticsEnabled(true);
    mbs.registerMBean(statsMBean, on);

    CacheManager cacheMgr = utilMgr.getCacheManager();
    ManagementService.registerMBeans(cacheMgr, mbs, true, true, true, true);
} catch(Throwable t) {
    throw new RuntimeException(t);
}

你也可以使用这个getCacheManager()方法的UtilMgr如果你想检索的统计数据手动(这是什么我可能会做的事.) 你可以找到更多的信息,关于如何使用使用缓存和统计的对象 在这里的代码样本。

如果任何人都可以填补我在上一种静态的查找本届会议的工厂,而无需为创造这些额外的会议豆,我听到它。

其他提示

答案给予上述假定SingletonEhcacheProvider正在使用和它还需要utilmgr豆,这种其他解决方案使用的启动豆和不作单独的假设

@Name("hibernateStatistics")
@Scope(ScopeType.APPLICATION)
@Startup
public class HibernateUtils {
@In
private EntityManager entityManager;

@Create
public void onStartup() {
    if (entityManager != null) {
        try {
            //lookup the jboss mbean server
            MBeanServer beanServer = org.jboss.mx.util.MBeanServerLocator.locateJBoss();
            StatisticsService mBean = new StatisticsService();
            ObjectName objectName = new ObjectName("Hibernate:type=statistics,application=<application-name>");
            try{
                beanServer.unregisterMBean(objectName);
            }catch(Exception exc) {
                //no problems, as unregister is not important
            }
            SessionFactory sessionFactory = ((HibernateSessionProxy) entityManager.getDelegate()).getSessionFactory();
            mBean.setSessionFactory(sessionFactory);
            beanServer.registerMBean(mBean, objectName);

            if (sessionFactory instanceof SessionFactoryImplementor ){
                CacheProvider cacheProvider = ((SessionFactoryImplementor)sessionFactory).getSettings().getCacheProvider();
                if (cacheProvider instanceof EhCacheProvider)  {
                    try{
                        Field field = EhCacheProvider.class.getDeclaredField("manager");
                        field.setAccessible(true);
                        CacheManager cacheMgr = (CacheManager) field.get(cacheProvider);
                        ManagementService.registerMBeans(cacheMgr, beanServer, true, true, true, true);
                    }catch(Exception exc) {
                        //do nothing
                        exc.printStackTrace();
                    }
                }
            }

        } catch (Exception e) {
            throw new RuntimeException("The persistence context " + entityManager.toString() + "is not properly      configured.", e);
        }
    }
 }

}

我们使用MbeanServerLocator为boss下列步骤:将第二列步骤:服务器环境中的喜欢linux。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top