мы наблюдаем странную проблему с кешем запроса 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 не очень многословна, поэтому трудно понять, что происходит ...
Заранее благодарен!