2016-09-20 3 views
1

мы наблюдаем странную проблему с кешем запроса Hibernate, когда мы используем Hazelcast в качестве поставщика кеша. Это наша установка:Hibernate + Hazelcast Query Cache не обновляется иногда

  • Hazelcast 3.6.5 с hazelcast-hibernate4
  • Hibernate 4.3.10
  • 3 сервера в кластере

конфигурации в persistence.xml:

<properties> 
     <property name="javax.persistence.sharedCache.mode" value="DISABLE_SELECTIVE"/> 

     <property name="hibernate.cache.region_prefix" value="custom-pu"/> 
     <property name="hibernate.enable_lazy_load_no_trans" value="true"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
     <property name="hibernate.default_batch_fetch_size" value="50"/> 
     <property name="hibernate.jdbc.batch_size" value="50"/> 
     <property name="hibernate.event.merge.entity_copy_observer" value="log"/> 

     <property name="hibernate.session_factory_name" value="customSessionFactory"/> 

     <property name="hibernate.cache.hazelcast.configuration_file_path" 
        value="${config.dir}/custom-hazelcast.xml"/> 
     <property name="hibernate.cache.hazelcast.instance_name" value="customInstance"/> 
     <property name="hibernate.cache.hazelcast.use_native_client" value="false"/> 
     <property name="hibernate.cache.region.factory_class" 
        value="com.hazelcast.hibernate.HazelcastLocalCacheRegionFactory"/> 
     <property name="hibernate.cache.hazelcast.shutdown_on_session_factory_close" value="false"/> 
     <property name="hibernate.cache.use_second_level_cache" value="true"/> 
     <property name="hibernate.cache.use_query_cache" value="true"/> 

     <property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default"/> 
     <property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default"/> 
    </properties> 

Иногда пользователь обновляет некоторые данные, а пользователи, находящиеся на одном и том же узле, или на другом узле не видят обновлений - SQL-запросы отсутствуют отправлено против БД (как отмечено в журналах). Очистка кеша запросов на одном узле приводит к тому, что ВСЕ УЗЛЫ запрашивают свежие данные из БД.

Мы впервые заметили это со списком сущностей, поддерживаемых представлением базы данных, но представление правильно аннотируется с @Synchronized, и во время отладки мы видели, что Hibernate корректно проверяет регионы для указанных таблиц. Если кеш запросов перестает работать, тайм-аут кеша (настроенный в файле hazelcast.xml) приводит к тому, что в конечном итоге будут отображаться корректные результаты.

Копаясь в журналах, мы увидели, что после того, как кеш запросов перестает работать с кеш-метками timestamp, данные кэширования для регионов, упомянутых в @Synchronized, больше, чем результат кэша запроса, поэтому Hibernate не отбрасывает старую запись и запрос новые данные.

Я проверил конфигурацию в файле persistence.xml несколько раз и увидел, что мы не активировали это свойство: hibernate.cache.use_minimal_puts - это могло бы иметь значение (я мог бы, конечно, просто применить его, но я хочу знать почему это решило бы нашу проблему).

Мы здесь в недоумении, потому что мы не знаем, как правильно воспроизвести проблему, и мы не знаем, что может вызвать ее. Кроме того, интеграция hibernate-cache из Hazelcast не очень многословна, поэтому трудно понять, что происходит ...

Заранее благодарен!

ответ

0

Hibernate предлагает только SPI второго уровня. Модуль Ehcache поддерживается командой Ehcache, то же самое с Infinispan и Hazelcast, поэтому кто-то из команды Hazelcast может знать, что вызывает эту проблему.

Поскольку вы спросили о hibernate.cache.use_minimal_puts, я отвечу на эту часть вашего вопроса. Это свойство конфигурации оптимизирует работу кэша второго уровня, чтобы минимизировать запись, в то время как вы платите цену за более частые чтения.

Этот параметр полезен для кластеризованных кешей, поэтому Hazelcast может извлечь из этого выгоду. Как правило, поставщик кэширования 2-го уровня автоматически включает его для кластеризации.