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