Включение статистики ehcache в jboss 4.2.1 - PullRequest
0 голосов
/ 30 октября 2008

Я установил hibernate.generate_statistics = true, и теперь мне нужно зарегистрировать mbeans, чтобы я мог видеть статистику в консоли jmx. Кажется, я никуда не денусь, и это не должно быть такой сложной проблемой. Может быть, я делаю вещи слишком сложными, но в любом случае до сих пор я пытался:

  • Я скопировал EhCacheProvider и заставил его создать расширенную версию CacheManager, которая перегружала init () и вызывала ManagementService.registerMBeans (...) после инициализации. Весь код работал нормально до фактического вызова registerMBeans (...), который мог привести к сбою инициализации провайдера с общей ошибкой (к сожалению, я не записал это). Этот подход был мотивирован методами, используемыми в это прохождение представления Liferay.
  • Я создал свой собственный MBean с методом запуска, который запускал код, аналогичный в этом примере регистрации jmx mbeans * в ehcache . Кажется, все работает правильно, и мой mbean отображается в консоли jmx, но ничего для net.sf.ehcache.
  • С тех пор я обновил ehcache до 1.5 (мы использовали 1.3, не уверен, специфичен ли он для jboss 4.2.1 или просто что-то, что мы выбрали сами), и переключился на использование SingletonEhCacheProvider и пытался просто вручную получить статистику вместо дело с регистрацией Mbean. Это действительно не пошло немного лучше, хотя; если я вызываю getInstance (), то возвращаемый CacheManager имеет только копию StandardQueryCache, но журналы jboss показывают, что многие другие кэши были инициализированы (по одному для каждой из кэшированных сущностей в нашем приложении.)

РЕДАКТИРОВАТЬ: Ну, я понял одну вещь ... подключение через JConsole действительно показывает статистику mbeans. Я предполагаю, что ManagementFactory.getPlatformMBeanServer () не дает вам тот же сервер Mbean, который использует jboss. В любом случае, похоже, что я столкнулся с такой же проблемой, как и при попытке собрать статистику вручную, потому что я получаю все нули даже после небольшого перехода по приложению.

Ответы [ 2 ]

1 голос
/ 07 апреля 2010

Ответ, приведенный выше, предполагает, что используется 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.

0 голосов
/ 31 октября 2008

решаемая. Поскольку я не видел все кэши для своих сущностей, я подозревал, что не получаю нужный экземпляр 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);
}

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

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

...