2008-10-30 71 views
0

我設置hibernate.generate_statistics = TRUE,現在需要註冊的MBean,所以我可以看到JMX控制檯的統計信息。我似乎無法得到任何地方,這似乎不應該是這樣一個困難的問題。也許我在做事情過於複雜,但在任何情況下,到目前爲止,我已經試過:啓用JBoss中的Ehcache統計4.2.1

  • 我複製EhCacheProvider,把它實例化的CacheManager的擴展版本,重載init()和被稱爲ManagementService.registerMBeans(.. )初始化後。該代碼都跑細直到registerMBeans(...)的實際調用,這將導致供應商初始化失敗,一般錯誤(不幸的是我沒有把它寫下來。)這種方法是通過在this liferay performance walkthrough.
  • 使用的方法動機
  • 我創造了我自己的MBean與跑類似的代碼this example of registering ehcache's jmx mbeans啓動方法。一切似乎正常工作,我的mbean出現在jmx控制檯,但沒有net.sf.ehcache。
  • 我後來升級的Ehcache 1.5(我們使用的是1.3,不知道這是具體到JBoss 4.2.1或只是一些我們選擇了自己),並改爲使用SingletonEhCacheProvider並試圖只是手動抓取統計數字,而不是處理mbean註冊。但它並沒有真正好轉,如果我叫的getInstance()是唯一的恢復具有StandardQueryCache副本的CacheManager的,但JBoss的日誌顯示很多其他緩存已初始化

EDIT(每個在我們的應用程序緩存的實體。):好我已經想出了一件事......通過JConsole進行連接確實可以揭示統計信息mbeans。我猜ManagementFactory.getPlatformMBeanServer()不給你當JBoss是使用相同的MBean服務器。反正它看起來像我遇到類似的問題,當我試圖手工收集的統計數據,因爲我甚至我的應用程序點擊了一下後得到全零。

回答

0

已解決。由於我沒有看到我的實體的所有緩存,我懷疑我沒有獲得正確的SessionFactory實例。我開始了這條線(見我在問題中提供的鏈接的例子JMX註冊碼):

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

最終的結果是高速緩存管理器我最終結束了是一個新的實例,而不是一個來自持久性上下文。所以,我想重構爲:

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

但只是拋出一個異常,那麼剩下的沒有其他選擇(我不記得確切的文字東西的影響「不能初始化持久化上下文。」) ,我向應用程序添加了一個無狀態bean(UtilMgr),並讓持久性注入正確的SessionFactory。下面是豆:

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); 
} 

您還可以,如果你想手動檢索統計使用UtilMgr這個getCacheManager()方法(它是我可能會做什麼。)你可以找到更多關於如何使用緩存和統計對象的信息in the ehcache code samples.

如果任何人都可以填補我靜靜查找會話工廠的方法,而不需要creatin g這個額外的會話bean,我很樂意聽到它。

1

上面給出的答案假設正在使用SingletonEhcacheProvider,它也需要utilmgr豆,這個其他解決方案使用啓動Bean並沒有讓單身假設

@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); 
     } 
    } 
} 

}

我們使用作爲jboss mbean的MbeanServerLocator將是linux環境中的第二個mbean服務器。