Моя проблема заключается в том, что время от времени я заканчиваю устаревшими объектами в кеше из-за одной высылки транзакции и до того, как транзакция совершает другую транзакцию, выполняет чтение старого значения и, следовательно, также сохраняет его в кэш. Это приложение использует весну и ehcache.Операции с базами данных и кэширование
До сих пор мои исследования приходят к этим вариантам, но я не удивлюсь, если их будет больше. Я что-то упускаю?
Любые советы очень ценятся :) Что бы вы сделали и почему.
Вариант 1: Ignoreance
Ну, просто игнорировать ее и надеяться на лучшее. Не вариант.
Вариант 2: transactionAware = истина
Свойство на классе менеджера кэша весной. Это устраняет одну проблему и вводит другую. Выселение задерживается до совершения транзакции, а другие транзакции не могут перехватывать и хранить старые данные в кеше. Тем не менее, если я в совершил ту же транзакцию, выполняющую операцию, которая попадает в кеш, я получу старое значение, так как оно еще не было выселено.
Вариант 3: XA
Из документации это звучит как рекомендуемый способ.
Используйте этот режим, когда вы кэшировать данные из других хранилищ данных, таких как СУБД или JMS, и хотите сделать это слитно под контролем API JTA («Java Transaction API»), но без накладные расходы на полную двухфазную фиксацию.
Вариант 4: локальные транзакции
Возможно, «дешевле», чем ХА, но требует ручной работы.
Вариант 5: редизайн Измените дизайн приложения, чтобы эти транзакции не имели условий гонки.