Frage

Ich habe gesetzt hibernate.generate_statistics = true und müssen jetzt die MBeans registrieren, damit ich die Statistiken in der JMX-Konsole sehen können. Ich kann nicht überall zu bekommen scheinen, und dies scheint nicht, wie es so ein schwieriges Problem sein sollte. Ich mache die Dinge komplizieren Vielleicht, aber in jedem Fall so weit ich habe versucht:

  • Ich kopierte EhCacheProvider und hatte es eine erweiterte Version von Cachemanager instanziiert die init überlastet () und rief ManagementService.registerMBeans (...) nach der Initialisierung. Der Code alle lief gut, bis der eigentliche Anruf registerMBeans (...), die die Provider-Initialisierung mit einem generischen Fehler fehlschlagen verursachen würde (leider habe ich es nicht aufschreiben.) Dieser Ansatz durch die Verfahren, die in diese liferay Leistungsmarsch.
  • habe ich meine eigene MBean mit einem Start-Methode, die einen ähnlichen Code zu dieses Beispiel ehcache des JMX MBeans der Registrierung . Alles schien richtig zu arbeiten und meine mbean zeigt sich in der JMX-Konsole, aber nichts für net.sf.ehcache.
  • Ich habe da ein Upgrade ehcache bis 1,5 (wir 1.3 verwendet haben, nicht sicher, ob das spezifische 4.2.1 bis jboss oder einfach nur etwas, das wir uns selbst gewählt haben) und geändert, um die SingletonEhCacheProvider verwenden und versuchen, die Statistiken nur greifen manuell statt mit der mbean Registrierung zu tun. Es hat sich nicht wirklich besser wenn gegangen; wenn ich rufe getInstance (), um den Cachemanager, die zurückgegeben hat nur eine Kopie von StandardQueryCache, aber Jboss Protokolle zeigen, dass viele andere Cache-Speicher initialisiert wurden (eine für jede der im Cache gespeicherten Entitäten in unserer Anwendung.)

EDIT: Nun, ich habe eine Sache herausgefunden ... über JConsole verbindet sich die Statistiken MBeans offenbaren. Ich denke, ManagementFactory.getPlatformMBeanServer () nicht gibt Ihnen die gleichen MBeanServer wie Jboss verwendet. Auf jeden Fall sieht es aus wie ich ein ähnliches Problem wie zu begegnen, wenn ich versuchte, manuell die Statistiken zu sammeln, weil ich alle Nullen sogar ein bisschen nach einem Klick durch meine app bin immer.

War es hilfreich?

Lösung 2

Gelöst. Da ich nicht all Caches für meine Entitäten sehe vermuten ich, dass ich nicht die richtige Instanz Session bekommen. Ich begann mit dieser Linie (siehe den Registrierungscode Beispiel JMX in der Verbindung I in Frage gestellt):

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

Das Endergebnis war der Cache-Manager ich endete schließlich mit einer neuen Instanz war nicht derjenige, von dem Persistenzkontext. Also habe ich versucht Refactoring wie:

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

aber das warf nur eine Ausnahme (ich erinnere mich nicht den genauen Text, etwas in der Art von „kann nicht Persistenzkontext initialisieren“) ohne andere Optionen So verließ, habe ich eine stateless Bean (UtilMgr) zu meine Anwendung und lassen Persistenz injizieren, um die richtige Session. Hier ist die Bohne:

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

und hier ist der korrigierte Code aus dem zuvor erwähnten Durchlauf:

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

Sie können auch diese getCacheManager () -Methode von UtilMgr verwenden, wenn Sie manuell Statistiken abgerufen werden sollen (das ist, was ich wahrscheinlich sowieso tun werde.) Sie können weitere Informationen über finden wie die Nutzung der Cache und Statistik-Objekte verwenden in den ehcache Codebeispiele.

Wenn jemand mich in eine Art und Weise füllen kann statisch Lookup die Sitzung Fabrik, ohne dass dieser zusätzlichen Session-Bean erstellen, würde ich gerne hören.

Andere Tipps

Die Antwort oben angegebene geht davon aus, dass SingletonEhcacheProvider benutzt wird und es braucht auch die utilmgr Bohne, diese andere Lösung verwendet einen Startup-Bean und stellt nicht die Singleton Annahme

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

}

Wir verwenden MbeanServerLocator wie Jboss mbean würde die zweite MBeanServer in Umgebungen wie Linux sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top