Как полностью отключить кеширование Hibernate? (с Spring 3, Hibernate с аннотациями) - PullRequest
9 голосов
/ 15 ноября 2010


Мое java-приложение запрашивает у сервера MySQL запрос каждые 10 секунд.
Я вручную вставляю в таблицу новую строку.
И Hibernate не может его найти.
Также, когда я вручную удаляю строку, Hibernate показывает, что эта строка существует.
Я полагаю, что это потому, что Hibernate кэширование.
Есть ли способ вообще его отключить?
Спасибо!

Ответы [ 3 ]

12 голосов
/ 15 ноября 2010

Вы имеете в виду кэш первого уровня или кэш второго уровня?Наличие Hibernate кэша второго уровня, такого как Ehcache , который кэширует объекты, соответствующие строкам в той же таблице, которую вы изменяете вручную, может вызвать описанное вами поведение.Кэш первого уровня не вызывает такого поведения, и я не думаю, что вы все равно можете его отключить.

Чтобы отключить кэш второго уровня Hibernate, удалите из файла конфигурации Hibernate hibernate-cfg.xml,все строки, которые ссылаются на кэш второго уровня.Например:

<!-- Enable the second-level cache  -->
<property name="hibernate.cache.provider_class">
    net.sf.ehcache.hibernate.EhCacheProvider
</property>
<property name="hibernate.cache.region.factory_class">
    net.sf.ehcache.hibernate.EhCacheRegionFactory
</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.use_structured_entries">true</property>     
<property name="hibernate.cache.generate_statistics">true</property>
1 голос
/ 27 февраля 2016

Чтобы «попытаться» отключить кэш первого уровня, я высылаю его каждый раз, когда запрашивается EntityManager.работал для меня;)

public EntityManager getEntityManager(){
        if( emf == null ){
            if (parameters == null) {
                emf = Persistence.createEntityManagerFactory(persistenceUnitName);
            } else {
                emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters);
            }
        } else {
            emf.getCache().evictAll();
        }

        EntityManager em = emf.createEntityManager();
        return em;
    }
0 голосов
/ 09 января 2015

вы можете использовать hints.put ("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);в вашем постоянном методе () это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...