【发布时间】:2011-04-29 09:44:12
【问题描述】:
我在 Hibernate 中使用 Ehcache。
如何通知缓存数据库已更改?如何使缓存的数据无效?如何以编程方式实现这一目标?
【问题讨论】:
标签: ehcache
我在 Hibernate 中使用 Ehcache。
如何通知缓存数据库已更改?如何使缓存的数据无效?如何以编程方式实现这一目标?
【问题讨论】:
标签: ehcache
具体是什么意思?有两种方法可以在数据库中进行更改:应用内和应用外
在应用内,您可以轻松触发失效。第二个更难解决。缓存元素与键一起存储,您可以根据该键将其删除。
CacheManager manager = CacheManager.getInstance();
cache = manager.getCache(cacheName);
cache.remove(key);
or
cache.removeAll();
当然取决于您如何配置 ehcache。但是您需要知道保存该对象的缓存的名称。
【讨论】:
这就是您可以使所有 EhCache 项无效而无需打扰各个缓存名称的方法:
CacheManager manager = CacheManager.getInstance();
String[] names = manager.getCacheNames();
for (String name : names)
{
Cache cache = manager.getCache(name);
cache.removeAll();
}
【讨论】:
.getCache 替换为 .getEhcache,并将 Cache 替换为 Ehcache。否则,即使存在缓存,.getCache 也会返回 null。
试试:
CacheManager.create().clearAll()
它会清除CacheManager中的所有缓存。
要只清除一个特定的缓存,请从缓存管理器中获取它并删除所有元素:
CacheManager cacheManager = CacheManager.create();
Ehcache cache = cacheManager.getEhcache(cacheConfiguration.getName());
cache.removeAll();
【讨论】:
设置缓存过期时间,以便数据的刷新频率与数据库更改的频率相同或更高。
您还可以仅在缓存中更新数据库中更改的元素。
【讨论】:
如果你想删除一个特定的缓存(例如:employeeCache)
@Autowired
CacheManager cacheManager;
要使缓存失效的地方,使用下面的代码
Cache cache = cacheManager.getCache("employeeCache");
cache.removeAll();
【讨论】: