문제

hibernate.generate_statistics = true를 설정했으며 이제 JMX 콘솔에서 통계를 볼 수 있도록 mbeans를 등록해야합니다. 나는 아무데도 갈 수없는 것 같고 이것은 그렇게 어려운 문제가되어야하는 것처럼 보이지 않습니다. 어쩌면 나는 일을 압도적으로 만들고 있지만 지금까지는 지금까지 시도했습니다.

  • 나는 ehcacheprovider를 복사하고 초기화 후 init ()를 과부하시키고 managementservice.registermbeans (...)라고 불리는 연장 된 Cachemanager 버전을 인스턴스화했습니다. 코드는 모두 RegisterMbeans (...)에 대한 실제 호출이 될 때까지 모두 정상적으로 실행되었으며, 이는 공급자 초기화가 일반적인 오류로 실패하게됩니다 (불행히도 나는 그것을 쓰지 않았습니다.)이 접근법은 사용 된 방법에 의해 동기가 부여되었습니다. 이 Liferay 성능 연습.
  • 비슷한 코드를 실행하는 시작 방법으로 내 자신의 mbean을 만들었습니다. Ehcache의 JMX MBeans 등록의 예. 모든 것이 올바르게 작동하는 것처럼 보였고 JMX 콘솔에 MBEAN이 나타나지만 Net.sf.ehcache에는 아무것도 나타나지 않습니다.
  • 이후 Ehcache를 1.5로 업그레이드했으며 (우리는 1.3을 사용하고 있었는데, Jboss 4.2.1에만 해당되는지 또는 우리가 선택한 것이 확실하지 않습니다) Singletonehcacheprovider를 사용하여 변경하고 통계를 처리하는 대신 수동으로 통계를 가져 오려고 노력했습니다. MBEAN 등록. 그래도 실제로는 더 나아지지 않았습니다. getInstance () 호출하면 반환 된 캐시 메너에 대해서만 표준 QueryCache의 사본이 있지만 JBoss 로그는 다른 많은 캐시가 초기화되었음을 보여줍니다 (응용 프로그램의 각 캐시 된 엔티티마다 하나씩).

편집 : 글쎄, 나는 한 가지를 알아 냈습니다 ... jconsole을 통해 연결하면 통계 mbeans가 공개됩니다. ManagementFactory.getPlatFormMBeanServer ()가 JBOSS와 동일한 MBEAN 서버를 제공하지 않는다고 생각합니다. 어쨌든 통계를 수집하려고 할 때와 비슷한 문제가 발생하는 것처럼 보입니다. 앱을 클릭 한 후에도 모든 0을 얻을 수 있기 때문입니다.

도움이 되었습니까?

해결책 2

해결되었습니다. 나는 내 단체의 모든 캐시를 보지 못했기 때문에 올바른 세션 factory 인스턴스를 얻지 못했다고 의심했습니다. 이 줄로 시작했습니다 (질문에 제공된 링크의 예제 JMX 등록 코드 참조) :

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

최종 결과는 내가 궁극적으로 결국 캐시 관리자가 새로운 인스턴스였으며 지속성 컨텍스트의 인스턴스가 아닌 인스턴스였습니다. 그래서 나는 다음과 같이 리팩토링을 시도했습니다.

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

그러나 그것은 단지 예외를 던졌습니다 (정확한 텍스트를 기억하지 못합니다. "지속성 컨텍스트를 초기화 할 수 없습니다.") 다른 옵션이 남아 있지 않으면 내 응용 프로그램에 무국적 Bean (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 () 메소드를 사용할 수 있습니다 (어쨌든 내가 할 것입니다.) 사용 방법에 대한 추가 정보를 찾을 수 있습니다. Ehcache 코드 샘플에서.

이 추가 세션 Bean을 만들 필요없이 세션 공장을 정적으로 조회하는 방법에 누군가가 나를 채울 수 있다면, 나는 그것을 듣고 싶습니다.

다른 팁

위에 주어진 답변은 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이 Linux와 같은 환경에서 두 번째 mbean 서버가 될 것이기 때문에 mbeanserverlocator를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top