2016-08-12 1 views
0

Мы находимся в середине проекта модернизации нашего приложения OSGi сервера от:Weird вопрос Свидание с Hibernate в сервере OSGI Karaf

  • Karaf 2.3.1
  • OSGi Ядро 4.3.0
  • гибернации 3.4.0 Г.А.
  • Пружина (включая SpringDM) 3.2.2.RELEASE
  • c3p0 пула соединений 0.9.1.2
  • PostgreSQL Драйвер 9.1.901

To:

  • Karaf 4.0.5
  • OSGi Ядро 6.0.0
  • Hibernate 5.0.9.Final
  • Hikari пула соединений 2.4.3
  • Драйвер PostgreSQL 9.4- 1204-jdbc42

В новой версии используется декларативная служба ces вместо Spring DM.

После преобразования мы начали получать проблемы с получением Даты из базы данных. Любая дата, которая содержит дату перехода на летнее время в НЗ в этом году (25 сентября), получает непоследовательные результаты. Первые 5 раз мы запрашиваем эту дату после того, как сервер запустил, дата верна. Однако после этого он изменится на дату раньше. То есть, если база данных содержит «2016-09-25», она возвращает «2016-09-24».

Первоначально мы думали, что это была проблема населения JPA Entity, но теперь мы сузили его до очень простой Native Query:

em.createNativeQuery("SELECT DATE '2016-09-25'").getResultList() 

, который возвращает объект Date с 25, время 00:00 сначала несколько раз, затем он возвращает объект Date с 24-м, после этого - 11:00.

Странная вещь, если добавить время, как это:

em.createNativeQuery("SELECT DATE '2016-09-25 00:00:00'").getResultList() 

то мы всегда получаем объект Date с 25, время 00:00.

Что мы пытались:

  • Базовая тестовая программа, которая делает простой запрос JDBC - хорошо работает каждый раз
  • Hibernate Entity менеджер вне Karaf - хорошо работает каждый раз
  • Сроки, кроме 2016 -09-25 - работает нормально каждый раз

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

ответ

0

Похоже, что karaf устанавливает некоторую «переменную окружения» по-другому, чем у вас вне карафа. Я не уверен, что это такое. Я предлагаю также спросить об этом в списке спящего режима.

+0

Извините, христианин, в конце концов, в Карафе была красная селедка. Пожалуйста, см. Мой ответ. – DuncanKinnear

0

Оказывается, это была проблема с драйвером PostgreSQL. См. this discussion on the pgjdbc github site. Это связано с этой установкой конфигурации:

  • prepareThreshold = int

Определить количество PreparedStatement выполнений, требуемых прежде чем переходить на стороне сервера использовать подготовленных операторов. Значение по умолчанию - пять, то есть начало использования подготовленных операторов на стороне сервера для пятого выполнения одного и того же объекта PreparedStatement.

Если я понимаю, обсуждение правильно, после того, как порог подготовки был достигнут за количество раз, что то же самое подготовленное заявление выполняются, Postgres переключается на использование бинарных подготовленных заявлений на сервере, и они имеют неправильный часовой пояс ,

См. Также раздел «Server Prepared Statements» в документации PostgreSQL JDBC.

В наших тестах было несколько красных сельдей. Проблема проявляется только при использовании подготовленных операторов, поэтому наши тесты за пределами Karaf были в порядке, поскольку мы не использовали подготовленные инструкции в этих тестах, а Hibernate всегда использует подготовленные данные.

Проблема возникла, по крайней мере, до версии 9.4-1204-jdb42 (версия, которую мы использовали), однако в версии 9.4.1208 проблема больше не существует. Мы обновили эту версию драйвера, и проблема исчезла. Наш исходный сервер использовал версию 9.1, которая также не имела проблемы.

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