Я использую кеш второго уровня и кеш запросов. Могу ли я узнать, как программно очистить все кеши?
Как очистить все кеш-память Hibernate (ehcache) с помощью Spring?
Ответ 1
Чтобы очистить кеш сеанса, используйте 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 Cache (Hibernate 4.3).
А также выселение кэша второго уровня из руководства hibernate dev (4.3).
Ответ 3
Если вы подключаете Terracotta, у вас также есть возможность запускать Terracotta Dev Console, которая может проверять статистику о кеше, включать и выключать кеш и очищать содержимое кеша от пользовательского интерфейса.
Эта функциональность также доступна в JMX beans.
Ответ 4
Ответ @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.
}
Ответ 5
Если вы хотите очистить кеш второго уровня, используйте 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);
}
}
Подробнее о кэше второго уровня обратитесь
Ответ 6
вы можете пойти с этим также
request.getSession().invalidate();
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);