Hibernate запрос доступа к предыдущей версии объекта данных? - PullRequest
2 голосов
/ 08 февраля 2011

У меня есть кусок кода, использующий Hibernate, который ведет себя неожиданно;после многих попыток отладки я задаюсь вопросом, верно ли мое понимание обновлений сеансов / отображенных объектов Hibernate.Вот упрощенный сценарий:

У меня есть сопоставленный объект (MO), который определяется с помощью id (long) и даты (date / time).Существует основная процедура, которая выполняется каждые 60 секунд, которая проверяет любые МО, которые необходимо обработать, основываясь на дате / времени.Основная процедура выполняется в одном потоке.Вот псевдокод:

main () 
// open session
// get current date/time
// query all mapped objects where date/time field < current date/time
// for each mapped object which matches {
//   updateObject (session, current date/time, mapped object)
// }
// flush session
// close session

updateObject( Session s, Date currentTime, MappedObject mo ) 
// changes to mo object 
// add 1 day to currentTime and update date/time field in mo
// transaction begin
// update mo object
// transaction committed

Не показано: инициализация фабрики сеанса, процедуры обработки исключений

Фабрика сеанса настроена с максимальным размером пула соединений 20 (c3p0).Настройки по умолчанию используются для любого кэширования.

Проблема

Запрос возвращает МО, значения даты которых находятся в будущем (то есть поле даты / времени > текущая дата / время).Согласно объектному наблюдению, значение поля даты / времени в МО является старым, предыдущим значением (не пересчитанным, обновленным значением), которое заставляет запрос подобрать его и выполнить процедуру updateObject.

Я предполагаю, что обновление прошло успешно путем проверки обновления путем непосредственного мониторинга БД;кроме того, ни одно из исключений транзакции не вызывается в соответствии с журналами.

Эта проблема возникает периодически - иногда это происходит несколько раз в день, в других случаях вообще не происходит.

Сведения о платформе

Hibernateверсия: 3.3.2.GA

c3p0 версия: 0.9.1

JRE версия: 1.6.0_16

Мои мысли

Моей первой мыслью была ошибка кодирования, но она не является базовой.Мне интересно, если каким-то образом старая версия объекта кэшируется в одном из объектов Session в пуле соединений, и по какой-то причине он время от времени выбирается.

Я беспокоюсь о больших последствиях, если есть проблема с обновлениями.

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

Любые предложенияили направления к результатам были бы наиболее признательны - спасибо заранее!

Обновление

Переход на Apache DBCP, похоже, решил проблему.Обновится, если проблема возникнет снова.

1 Ответ

0 голосов
/ 09 февраля 2011

Есть две вещи, которые вы можете попробовать ...

1) Установите следующее свойство Hibernate, чтобы отключить кэширование операторов: -

<property name="hibernate.c3p0.max_statements">0</property>

Если это не сработает ...

2) Вместо использования C3P0, попробуйте Apache DBCP , чтобы увидеть, есть ли у вас такая же проблема.Стоит легко поменяться.

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