У меня есть кусок кода, использующий 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, похоже, решил проблему.Обновится, если проблема возникнет снова.