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

17

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

    
задан cometta 17.03.2010 в 10:31
источник

5 ответов

16

Чтобы очистить кеш сеанса, используйте session.clear()

Чтобы очистить кеш второго уровня, используйте этот фрагмент кода

    
ответ дан Bozho 17.03.2010 в 10:33
источник
  • Для современных версий Hibernate было бы лучше следить за ответом @ dino. –  King Midas 23.10.2014 в 11:18
28

Фрагмент кода, указанный в ответе Божо, устарел в 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) .

Кроме того, выселение на уровне второго уровня из гибернатного dev guide (4.3).

    
ответ дан Dino 23.12.2013 в 16:39
источник
  • Я хочу очистить данные кеширования от кэша второго уровня, вызвав метод ниже: - sessionFactory.getCache (). evictEntityRegions (); Я просто хочу знать, есть ли вред в этом? Например: - Что произойдет, если я попытаюсь очистить кеш в середине транзакции? –  Vikas Vats 16.02.2017 в 15:55
  • Я полагаю, это зависит от вашей стратегии кэширования и провайдера. Возможно, вам придется протестировать его с выбранным. Справочный документ описывает различные настройки. –  Dino 17.02.2017 в 11:13
  • Я использую @Cache (использование = CacheConcurrencyStrategy.READ_WRITE). У меня есть случай. Предположим, что какая-то транзакция выполняется, чтобы получить данные из кеша второго уровня и данные в это время. В то же время другой поток вытесняет все кэши области, пока предыдущая транзакция еще не завершена. Тогда что будет в этом случае. Могу ли я получить null из кеша в этой транзакции и произойдет сбой db? Есть ли какие-либо проблемы? –  Vikas Vats 17.02.2017 в 11:38
  • Вы должны написать тест с вашим конкретным контекстом. Согласно документации, чтение-запись, по-видимому, соответствует вашему делу, но обратите внимание на то, что оно имеет все требования, подробно описанные здесь (см. Docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/...) –  Dino 17.02.2017 в 15:09
3

Если вы подключаете Terracotta, у вас также есть возможность запускать Terracotta Dev Console, которая может проверять статистику о кеше, включать и выключать кеш и очищать содержимое кеша от пользовательского интерфейса.

Эта функциональность также доступна из компонентов JMX.

    
ответ дан Taylor Gautier 17.03.2010 в 21:10
источник
0

Если вы хотите очистить кеш второго уровня, используйте 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);
    }
}

Подробнее о кэше второго уровня обратитесь     

ответ дан atish shimpi 26.10.2015 в 07:56
источник
-7

вы можете пойти с этим также

request.getSession().invalidate();      
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
    
ответ дан Raju Yadav 29.01.2015 в 08:43
источник
  • HttpSession и сеанс гибернации - это разные вещи. –  Sachin Verma 02.04.2015 в 11:41