我有一个配置为使用JPA和Hibernate的大型Java应用程序。它也可以配置为对实体和查询缓存使用ehcaching。但是,我打开了sql日志记录,并且没有缓存任何实体。所有实体查询都发生在每个请求上。
如何在运行时确定它是否运行ehcache以及它是否认为实体应该可缓存?
我没有写这个应用程序,所以我在这里停了一下。
它使用类的缓存声明。
正确使用Hibernate的所有其他声明来执行读/写操作。
答案 0 :(得分:3)
尝试这样的事情:
List<CacheManager> tempManagers = CacheManager.ALL_CACHE_MANAGERS;
System.out.println("# of CMs : " + tempManagers.size());
for (CacheManager tempCM : tempManagers) {
System.out.println("Got: " + tempCM.getName());
String[] cacheNames = tempCM.getCacheNames();
for (int i = 0; i < cacheNames.length; i++) {
String cacheName = cacheNames[i];
System.out.println(cacheName+" - "+ tempCM.getEhcache(cacheName).getStatistics().toString());
}
}
答案 1 :(得分:1)
简短的回答 - 调试器。
在加载实体的位置放置一个断点并在堆栈中跟随它。看看它是否曾尝试从EHCache获取对象。另外,检查它是否在从数据库中提取后尝试将其放入缓存中。
答案 2 :(得分:0)
我是这样实现的:
public boolean areCachesDefined() {
return this.cacheManagers.stream()
.anyMatch(cacheManager -> cacheManager.getCacheNames().iterator().hasNext());
}
其中cacheManagers
是具有每种缓存类型的缓存处理程序的集合(例如ehcache
)
答案 3 :(得分:0)
@mglauche 的解决方案非常好。此外,在启动期间,您可以搜索您的日志是否正在打印以下内容:
o.s.c.ehcache.EhCacheManagerFactoyBean : Initializing EhCache CacheManager