已解決。由於我沒有看到我的實體的所有緩存,我懷疑我沒有獲得正確的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);
}
您還可以,如果你想手動檢索統計使用UtilMgr這個getCacheManager()方法(它是我可能會做什麼。)你可以找到更多關於如何使用緩存和統計對象的信息in the ehcache code samples.
如果任何人都可以填補我靜靜查找會話工廠的方法,而不需要creatin g這個額外的會話bean,我很樂意聽到它。