Postgres сохраняет данные медленнее, чем Hibernate, читая значение - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть приложение GWT, которое использует hibernate для подключения к базе данных postgres. Когда я запускаю приложение в tomcat на более быстром сервере, я заметил проблему.

Представление в моем приложении загружает старые данные из БД. Так что же случилось? В представлении пользователь может ввести некоторые данные, а затем нажать кнопку «Сохранить». Это вызывает асинхронный вызов, в котором я сохраняю данные через спящий режим в postgres. Как только я выполняю commit () в коде (я устанавливаю для lazy update значение false), я возвращаюсь из асинхронного вызова, а затем обновляю представление (= перезагружаю данные из db и отображаю их). Это приводит к перечитыванию данных из базы данных. Однако представление иногда отображает старые данные. Затем я снова обновляю представление и вижу правильные текущие данные.

Я предполагаю, что функция commit () в hibernate вызывает асинхронный вызов, и поэтому я возвращаюсь раньше после первого асинхронного вызова (когда пользователь нажимает кнопку сохранения), чем в hibernate, сохраняя данные в postgres. Поэтому представление загружает старые данные.

У кого-нибудь есть похожие проблемы с hibernate и postgres?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Кэш 2-го уровня Hibernate не фиксирует обновления базы данных, которые происходят с базовыми объектами с помощью представлений, собственных запросов и т. Д. Я бы сказал, что вас это укусило, и вам нужно явно аннулировать кэш, когда Вы знаете, что прервали его, или вам нужно его отключить.

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

Из этих двух я бы сказал, что проблемы с кэшированием в Hibernate являются наиболее вероятным виновником.

0 голосов
/ 08 декабря 2011

Ваше объяснение неверно. При фиксации транзакции гибернации выполняется запись и фиксация в базе данных, и если фиксация завершается успешно, данные фиксируются в базе данных.

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

Другим объяснением может быть то, что второй асинхронный вызов не ожидает завершения первого, прежде чем отправляется на сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...