H2 в памяти DB: установить часовой пояс с помощью JDBC?Модульные тесты Java - PullRequest
0 голосов
/ 12 октября 2018

У меня странная дилемма с h2.У нас есть настройка h2 db в памяти, режим а-ля Oracle, чтобы помочь с нашими модульными тестами.Мы установили часовой пояс приложения как

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

У нас есть наша настройка h2 в качестве источника данных в нашем приложении maven / springboot, как показано ниже:

datasource.config.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=ORACLE;
datasource.config.username=sa
datasource.config.password=
datasource.config.driver-class-name=org.h2.Driver

И у меня есть тестбег, который основан на отметке времени.Итак, я написал этот маленький картограф, чтобы получить время DB из h2:

@Select("Select CURRENT_TIMESTAMP")
String selectCurrentTimestamp();

Проблема в том, что h2 продолжает брать реальное системное время, на котором работает, вместо того, чтобы слушать настройки часового пояса, изложенные выше.Так что вставки в наши юнит-тесты вставляются в нужное время, независимо.Но выборки, основанные на времени, похоже, переводятся на основе системного времени и, следовательно, не работают должным образом.Я также сделал переход к использованию более новых java 8 классов java.time в качестве параметров для моих функций выбора и т. Д. До сих пор нет игры в кости.

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

Кто на самом деле является источником этой проблемы, JDBC?Или H2?И в зависимости от этого, как я могу начать путь, чтобы исправить это?Есть ли строка, которую я могу предоставить для URL соединения JDBC?Или сделать другую настройку?

1 Ответ

0 голосов
/ 15 февраля 2019

Я столкнулся с этой же проблемой.Подсказка, которая указала мне правильный путь, пришла от этого ответа в предыдущем посте :

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

Использование PostConstruct в классе Application слишком поздно.По умолчанию часовой пояс будет установлен после того, как драйвер уже будет загружен, а H2 уже будет заблокирован.

Несколько решений, которые могут работать здесь:

  1. Предоставьте аргумент JVMустановить часовой пояс: -Duser.timezone = UTC
  2. Установить часовой пояс по умолчанию перед загрузкой SpringApplication (или перед загрузкой чего-либо еще):

    public static void main(String[] args) {
       TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
       SpringApplication.run(Application.class, args);
    }
    

    Примечание. Вы также можете запустить это в ответ на ApplicationContextInitializedEvent, так как другие компоненты еще не загружены.Я не уверен, есть ли какие-то минусы в том, чтобы просто делать это в Main.

...