解决了。由于我没有看到我的实体的所有缓存,我怀疑我没有获得正确的 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() 方法(无论如何我可能都会这样做。)您可以在 ehcache 代码示例中找到有关如何使用缓存和统计对象的更多信息。
如果有人可以告诉我静态查找会话工厂而不需要创建这个额外的会话 bean 的方法,我很想听听。