Обновление кэша Infinispan / hibernate 2-го уровня не является транзакционным? - PullRequest
0 голосов
/ 26 октября 2019

Infinispan в качестве спящего кеша 2-го уровня не обновляется транзакционным способом, аналогичным тому, как работает транзакция базы данных. Под этим я подразумеваю, что транзакция базы данных не видна другим транзакциям, пока не будет полностью зафиксирована. Основываясь на ведении журнала, я обнаружил, что транзакции (JEE MDB) могут частично обновлять данное обновление Infinispan. Чтобы уточнить, вот мои настройки:

  1. Jboss
  2. JPA (спящий режим)
  3. Infinispan в качестве поставщика кэша 2-го уровня (режим транзакций локального кэша FULL_XA.
  4. JTA включен.
  5. База данных настроена как источник данных XA

То, что я видел, это то, что если JEE-бин запускается после фиксации транзакции в БД транзакциии то, что я считаю обновлением infinispan (commit), может видеть некоторые обновления infinispan (это не то, как транзакция базы данных работает и нежелательно). Пожалуйста, помогите.

Также, пожалуйста, подтвердите, что1) Кэш второго уровня обновляется только при фиксации транзакции. 2) Я не совсем схожу с ума, думая, что обновление должно быть атомарным по отношению к другим транзакциям ... либо они не видят ничего, либо всего этого.

1 Ответ

0 голосов
/ 07 ноября 2019

Может показаться сумасшедшим, но то, что вы просите, очень дорого для кеша:)

Я изначально начал с такого дизайна 10 лет назад, когда Infinispan мог выступать в качестве ресурса XA с Hibernate. Это было медлительно.

Очевидно, что это было не правильное решение, поэтому мы перешли к интеграции с Hibernate с помощью синхронизации, что стало большим улучшением. На этом этапе Infinispan все еще был транзакционным и вел себя так, как вы видите.

Транзакционный Infinispan был в конечном итоге удален, опять же по соображениям производительности, когда мы выяснили, как обращаться с кластерными ситуациями без транзакций.

Ключевым моментом для Hibernate 2LC является то, что он должен помочь ускорить ваши приложения. Конечно, согласованность важна, поэтому мы гарантируем, что любые откаты будут отражены в Infinispan, но да, половина данных транзакции уже может быть в кеше.

Если согласованность данных в полете как-то является проблемой,Я бы порекомендовал использовать оптимистическую блокировку, которую провайдер кэша Infinispan может использовать для сравнения версий данных. Таким образом, он может видеть, пытается ли старая версия данных обновить более новую, но мы не видели таких случаев, так как многие такие ситуации запрещены самой Hibernate.

Как всегда, если у вас есть определенныйСитуация, которая вызывает проблемы, дайте нам знать.

ps Мы создали несколько простых учебных пособий по Hibernate Infinispan для различных сред (local, spring, wildfly) здесь , поэтому я предлагаю вам взглянуть нате. У них есть не только примеры кода, но и настройки конфигурации, которые прекрасно работают:).

ps2. Эти примеры не устанавливают FULL_XA в кеш;)

...