2016-11-15 8 views
0

Моя проблема заключается в том, что время от времени я заканчиваю устаревшими объектами в кеше из-за одной высылки транзакции и до того, как транзакция совершает другую транзакцию, выполняет чтение старого значения и, следовательно, также сохраняет его в кэш. Это приложение использует весну и ehcache.Операции с базами данных и кэширование

До сих пор мои исследования приходят к этим вариантам, но я не удивлюсь, если их будет больше. Я что-то упускаю?

Любые советы очень ценятся :) Что бы вы сделали и почему.

Вариант 1: Ignoreance

Ну, просто игнорировать ее и надеяться на лучшее. Не вариант.

Вариант 2: transactionAware = истина

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

Вариант 3: XA

Из документации это звучит как рекомендуемый способ.

Используйте этот режим, когда вы кэшировать данные из других хранилищ данных, таких как СУБД или JMS, и хотите сделать это слитно под контролем API JTA («Java Transaction API»), но без накладные расходы на полную двухфазную фиксацию.

Вариант 4: локальные транзакции

Возможно, «дешевле», чем ХА, но требует ручной работы.

Вариант 5: редизайн Измените дизайн приложения, чтобы эти транзакции не имели условий гонки.

ответ

0

Если вы действительно хотите быть атомарным, XA - это путь.

Затем вариант 2 может быть проще, но вам придется работать в единице работы. Единица работы содержит действительные данные транзакции. И предотвратить извлечение устаревших данных из кеша. Он используется в качестве кеша над кешем. Примером этого является сеанс Hibernate. Его содержание всегда актуально для транзакции.

 Смежные вопросы

  • Нет связанных вопросов^_^