Я использую кеш второго уровня и кеш запросов. Могу ли я узнать, как программно очистить все кеши?
Как очистить весь кэш Hibernate (ehcache) с помощью Spring?
Ответы (7)
Чтобы очистить кеш сеанса, используйте session.clear()
Чтобы очистить кэш 2-го уровня, используйте этот фрагмент кода
Фрагмент кода, указанный в ответе Божо, устарел в Hibernate 4.
Согласно Hibernate JavaDoc, вы можете использовать org.hibernate.Cache.evictAllRegions()
:
Исключить данные из всех областей запроса.
Использование API:
Session session = sessionFactory.getCurrentSession();
if (session != null) {
session.clear(); // internal cache clear
}
Cache cache = sessionFactory.getCache();
if (cache != null) {
cache.evictAllRegions(); // Evict data from all query regions.
}
Кроме того, вы можете очистить все данные из определенной области:
org.hibernate.Cache.evictCollectionRegions()
org.hibernate.Cache.evictDefaultQueryRegion()
org.hibernate.Cache.evictEntityRegions()
org.hibernate.Cache.evictQueryRegions()
org.hibernate.Cache.evictNaturalIdRegions()
Вы можете проверить интерфейс JavaDoc для спящего кэша (Hibernate 4.3).
А также удаление кэша второго уровня из руководства по спящему режиму (4.3).
Если вы подключите Terracotta, у вас также будет возможность запустить Terracotta Dev Console, которая может просматривать статистику о кеше, включать и выключать кеш, а также очищать содержимое кеша из пользовательского интерфейса.
Эта функциональность также доступна в bean-компонентах JMX.
Ответ @Dino почти сработал для меня, но я получил ошибку от sessionFactory.getCurrentSession()
(CurrentSessionContext не настроен!). Я обнаружил, что это сработало для меня:
// Use @Autowired EntityManager em
em.getEntityManagerFactory().getCache().evictAll();
// All of the following require org.hibernate imports
Session session = em.unwrap(Session.class);
if (session != null) {
session.clear(); // internal cache clear
}
SessionFactory sessionFactory = em.getEntityManagerFactory().unwrap(SessionFactory.class);
Cache cache = sessionFactory.getCache();
if (cache != null) {
cache.evictAllRegions(); // Evict data from all query regions.
}
То же, что и ответ @Dino, сокращенный синтаксис для API JPA 2.0:
@Autowired
private EntityManagerFactory entityManagerFactory;
public void clearHibernateCaches() {
entityManagerFactory.getCache().unwrap(org.hibernate.Cache.class).evictAllRegions();
}
Если вы хотите очистить кеш 2-го уровня, используйте API sessionFactory.evictEntity(entityName)
Код:
/**
* Evicts all second level cache hibernate entites. This is generally only
* needed when an external application modifies the database.
*/
public void evict2ndLevelCache() {
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
for (String entityName : classesMetadata.keySet()) {
logger.info("Evicting Entity from 2nd level cache: " + entityName);
sessionFactory.evictEntity(entityName);
}
} catch (Exception e) {
logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
}
}
Подробнее о кэше 2-го уровня см.
вы также можете пойти с этим
request.getSession().invalidate();
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);