2016-04-04 4 views
0

Ситуация:Почему мой является EntityManager выборки устаревшей объект базы данных

  • App A (война работает на коте 7, остальное интерфейс для веба-приложения)
  • App B (Java автономного, запланированные пакетных заданий Загрузки данных из файла в базу данных)
  • Между общей таблицей управления с записью на файл.
  • Приложение A правильно сохраняет новую запись в таблице управления и устанавливает соответствующее состояние (ожидает), сигнализируя, что приложение B для начала обработки.
  • Веб-приложение правильно отображает состояние в ожидании.
  • Приложение B обрабатывает пакет, загружает данные и правильно устанавливает новое состояние (обработанное), сигнализирующее, что загрузка завершена. Это легко проверить простым запросом с помощью fx Squirrel.
  • При обновлении страницы в веб-приложении состояние отображается неправильно, как ожидающее, а не правильное состояние: обработано. При отладке ответа переменная состояния назначается в ожидании. Мои журналы указывают, что запрос выполняется при обновлении.
  • Если я перезагружу свой Tomcat, следующий запрос покажет правильный результат, то есть состояние будет обработано. Это также озадачивает меня, что помимо EntityManager поддерживает объект базы данных?

Проблема: Я просто не могу понять, почему приложение А продолжает видеть состояние в ожидании. Я уже пробовал несколько вещей, чтобы гарантировать, что сущностьManager имеет очищенный кеш (как для приложений A, так и для приложения B), но все же запросы App A в конечном итоге получают неправильное состояние.

+0

Вы очищаете свой EntityManager и обновляете объекты каждый раз, когда вы обновляете/вставляете оба приложения A/App B? –

+0

Обязательство о транзакции должно быть скрыто. И из-за того, что все мои вставки/обновления выполняются в транзакциях, а истинное :-) состояние легко проверяется с помощью fx Squirrel. – MMA

ответ

0

@Baldurian Спасибо за подсказку. Я добавил обновление на выбранном объекте, и он сработал. Я получаю свое состояние через дочерний объект. Оказывается, что дочерний объект никогда не обновлялся, хотя приложение A опустошало кеш перед каждым запросом. Не совсем такое поведение, которого я ожидал.

0

EclipseLink по умолчанию поддерживает second level cache, который находится за пределами EntityManager и почему очистка кеша EntityManager не помогает.

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

Если вы часто вносите изменения вне этого приложения JPA, возможно, лучше отключить общий кэш для некоторых или всех Entities. Свойство <property name="eclipselink.cache.shared.default" value="false"/> может использоваться для его отключения для всех объектов или вы можете выборочно выбирать и выбирать с помощью аннотации @Cache

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