2008-10-30 3 views
0

Я установил hibernate.generate_statistics = true и теперь вам нужно зарегистрировать mbeans, чтобы я мог видеть статистику в консоли jmx. Кажется, я ничего не могу найти, и это не похоже, что это должна быть такая сложная проблема. Может быть, я делаю вещи усложненной, но в любом случае, до сих пор я пытался:Включение статистики ehcache в jboss 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() в CacheManager, который возвращается только имеет копию StandardQueryCache, но JBoss журналы показывают, что многие другие кэши были инициализированы

EDIT (один для каждой из кэшированных объектов в нашем приложении.): Ну Я выяснил одно: подключение через JConsole показывает статистику mbeans. Я думаю, что ManagementFactory.getPlatformMBeanServer() не дает вам тот же mbean-сервер, что и jboss. В любом случае, похоже, что я столкнулся с аналогичной проблемой, так как когда я пытался собирать статистику вручную, потому что я получаю все нули даже после небольшого нажатия на мое приложение.

ответ

0

Решено. Поскольку я не видел все кеши для своих сущностей, я подозревал, что не получаю правильный экземпляр SessionFactory. Я начал с этой линией (см регистрационный код пример JMX в ссылке я представил в вопросе):

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

Конечный результат был менеджером кэша, я в конечном счете, в конечном итоге с был новый экземпляр, а не один из контекста персистентности. Так что я попытался рефакторинга как:

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

, но это просто выбросил исключение, так осталось никаких других вариантов (я не помню точный текст что-то к эффекту «не может инициализировать контекст сохранения.») , Я добавил в мое приложение фазу без состояния (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); 
} 

Вы также можете использовать этот метод getCacheManager() из UtilMgr, если вы хотите получить статистику вручную (что что я, вероятно, сделаю в любом случае.) Вы можете найти больше информации о том, как использовать объекты Cache и Statistics. in the ehcache code samples.

Если кто-нибудь может наполнить меня способом статического поиска фабрики сеансов без необходимости креатина g этот дополнительный сеансовый компонент, я бы хотел его услышать.

1

Ответ приведенный выше предполагает, что 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 как jboss mbean будет вторым сервером mbean в таких средах, как linux.

Смежные вопросы