У меня есть приложение, использующее JPA, Hibernate и ehcache, а также декларативное Spring
сделки. Нагрузка на БД довольно высока, поэтому все кэшируется для ускорения работы,
в том числе коллекции. Теперь не секрет, что коллекции кэшируются отдельно
от сущностей, которые владеют ими, так что если я удаляю сущность, которая является элементом такого
кэшированная коллекция, сохранить объект, который должен быть элементом одного, или обновить
сущность такая, что она путешествует из одной коллекции в другую, я должен выполнить выселение
от руки.
Поэтому я использую прослушиватель событий гибернации, который отслеживает вставленные, удаленные объекты
или обновляется и сохраняет эту информацию для синхронизации транзакций, зарегистрированных в Spring
Менеджер транзакций. Затем синхронизация выполняет выселение, как только
транзакция совершена.
Теперь проблема заключается в , что довольно часто некоторые другие параллельные транзакции удается найти
коллекция в кеше, которая только что была удалена (эти события обычно составляют десятые доли
второй (согласно журналу) и, естественно, вызывает исключение EntityNotFoundException.
Как правильно синхронизировать этот материал?
Я пытался выполнить выселение в каждом из 4 методов TransactionSynchronization (который
вызываются в разные моменты времени относительно завершения транзакции), это не помогло.