Подтвердить что ты не робот

Как очистить все кеш-память Hibernate (ehcache) с помощью Spring?

Я использую кеш второго уровня и кеш запросов. Могу ли я узнать, как программно очистить все кеши?

4b9b3361

Ответ 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);