Как установить правильный часовой пояс MySQL JDBC в конфигурации Spring Boot

БД:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.27, for osx10.10 (x86_64) using  EditLine wrapper

Spring Boot: 2.1.1.RELEASE

Ошибка:

2019-01-01 15:56:25.849 ERROR 39957 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
> :bootRun
java.sql.SQLException: The server time zone value 'AEDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

Соответствующие части моего файла свойств:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC
spring.datasource.username=#####
spring.datasource.password=########
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

Что мне кажется странным, так это то, что ошибка указывает на то, что используемый часовой пояс - это AEDT, и тем не менее я указал UTC в spring.datasource.url. Читает ли Hikari что-нибудь еще при инициализации?

Это очень похоже на то, что Hikari игнорирует настройку часового пояса сервера в URL-адресе базы данных в пользу использования часового пояса моего собственного компьютера, который оказывается AEDT (Мельбурн, Австралия) - это нежелательное поведение. Я бы хотел, чтобы Хикари игнорировала часовой пояс моей машины. Кто-нибудь знает, как это сделать?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
28
0
57 312
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Установите useLegacyDatetimeCode false и установите ServerTimezone.

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

спасибо, но я уже пробовал - никакого эффекта. Как я уже упоминал, я не думаю, что Хикари смотрит на строку подключения для настроек часового пояса. Кроме того, я думаю, что обходной путь useLegacyDatetimeCode в основном предназначен для Hibernate (который я не использую)

Michael Coxon 01.01.2019 07:58

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

Janet 08.05.2019 06:18

Добавьте useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false в строку подключения:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Ответ принят как подходящий

Спасибо за ответы, но я нашел решение.

Как я и подозревал, Hikari игнорирует все, что вы помещаете в URL-адрес источника данных (извините, ребята, не имеет значения, что вы туда забиваете), по сути, он считывает настройку часового пояса из самого MySQL, то есть независимо от результата, который вы видите при выдаче команда

SELECT @@GLOBAL.time_zone;

в MySQL. В моем случае результатом была «СИСТЕМА», которая соответствует настройке моей локальной машины. Это был AEDT, который не поддерживается драйвером MySQL и, следовательно, мое исключение.

Выполнение того же запроса в AWS дало значение «UTC», которое поддерживается (и фактически то, что я хотел).

Поэтому мне пришлось установить часовой пояс на моем локальном сервере MySQL.

Во-первых, мне пришлось загрузить доступные часовые пояса с моего хоста (Mac OS X) в MySQL. Мне нужно было выяснить, где находится файл zoneinfo (в моем случае / usr / share / zoneinfo), затем выяснить, где находится утилита mysql_tzinfo_to_sql (каталог bin установки MySQL), и использовать ее для загрузки поддерживаемых часовых поясов моего локального компьютера. . В Mac OS X я выполнил команду:

/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Затем в MySQL я мог запустить команду

SET GLOBAL time_zone = UTC;

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

Я думаю, что это настоящая ловушка для многих людей, использующих MySQL с Spring Boot. Он будет работать, пока люди находятся в поддерживаемых часовых поясах, но если ваша машина разработки переключится на неподдерживаемый часовой пояс, он загадочным образом сломается, я удивлен, что это нигде не задокументировано. Исходный код MySQL Connector / J делает это очевидным, но иначе вы бы этого не узнали.

Может быть, это потому, что MySQL только что появился 5 лет назад, а я старый ископаемый и, ну, ну, ну просто слезай с моей лужайки!

Я добавил следующую переменную в URL-адрес db под application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT-6

и Spring Boot теперь работает нормально.

Это сработало для меня. Я установил переменную в URL-адресе db как таковую в application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=America/Los_Angeles

Это тот, который у меня сработал. Никогда не думал об использовании этого формата для указания часового пояса! Я использовал Australia/Melbourne

Jase 14.11.2019 14:00

Отличный ответ, если кто-то хочет использовать нулевой часовой пояс, установите значение serverTimezone=Etc/UTC.

Ron Shoshani 08.09.2020 11:10

Установить useLegacyDatetimeCode false у меня работает. Спасибо..

spring.datasource.url: jdbc:mysql://localhost:3306/employee_directory? 
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

Вслед за Шоном мне хватило вот этого: spring.datasource.url = jdbc: mysql: // $ {MYSQL_HOST: localhost}: 3306 / ДЕМОС? serverTimezone = UTC

Другой способ - поместить в файл application.properties следующую строку:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

Поставляется как опция в: https://www.baeldung.com/mysql-jdbc-timezone-spring-boot

Используя jdk 14, мне пришлось сделать это с моим application.properties

spring.jpa.properties.hibername.jdbc.time_zone=US/Michigan

изменить: форматирование

Я столкнулся с той же проблемой, но добавил

?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

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

spring.datasource.url = jdbc:mysql://localhost:3306/my-schema-name?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

В настоящее время я использую MySQL v8, и мне это хорошо подходит.

Я использую MySQL 8 и решил этот вопрос, введя значение свойства user.timezone.

Использование Java 8 в моем проекте.

Соответствующие настройки в application.properties:

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.datasource.url=jdbc:mysql://localhost:3306/mudi?serverTimezone=${user.timezone}

Использование 2.3.4.RELEASE в качестве родительского проекта.

Используемые зависимости:

  • весна-ботинок-стартер-тимьяновый лист
  • Spring-Boot-Starter-Web
  • Spring-boot-devtools
  • весенний пусковой тест
  • junit-vintage-двигатель
  • весна-загрузки-стартер-данные-JPA
  • MySQL-коннектор-Java

HTH,

ВБ ::

отличный материал ... из всех этих ответов мне больше всего нравится этот.

Llama 26.11.2020 03:18

Пробовал 3 метода.

  1. TimeZone.setDefault (TimeZone.getTimeZone ("Азия / Коломбо")); // В инициализаторе Spring
  2. spring.jpa.properties.hibernate.jdbc.time_zone = Азия / Коломбо // В applications.properties
  3. <spring-boot.run.jvmArguments> -Duser.timezone = Азия / Коломбо </spring-boot.run.jvmArguments> // Установка свойства в файле POM

Я также пробовал устанавливать свойства через URL-адрес JDBC;

  • useLegacyDatetimeCode = false
  • serverTimezone = Азия / Коломбо

Ничего из вышеперечисленного не помогло мне. Я заметил, что самый маловероятный подозреваемый Джексон переопределял мой часовой пояс.

spring.jackson.time-zone=Asia/Colombo (The Answer)

Включите это в свой application.properties (этого достаточно)

Проверено при загрузке Spring - 2.1.5.RELEASE, MYSQL8.

Другие вопросы по теме