Вопрос-ответ

MySQL JDBC Driver 5.1.33 - Time Zone Issue

Драйвер MySQL JDBC 5.1.33 - проблема с часовым поясом

Немного предыстории:

У меня есть веб-приложение Java 1.6, работающее на Tomcat 7. База данных MySQL 5.5. Ранее я использовал драйвер Mysql JDBC 5.1.23 для подключения к БД. Все работало. Недавно я обновился до драйвера Mysql JDBC 5.1.33. После обновления Tomcat выдает эту ошибку при запуске приложения.

WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents
more than one timezone. You must configure either the server or JDBC driver (via
the serverTimezone configuration property) to use a more specifc timezone value if
you want to utilize timezone support.

Почему это происходит?

Переведено автоматически
Ответ 1

Очевидно, чтобы заставить версию 5.1.33 драйвера JDBC для MySQL работать с часовым поясом UTC, нужно явно указать serverTimezone в строке подключения.

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Ответ 2

Я решил эту проблему, настроив MySQL.

SET GLOBAL time_zone = '+3:00';

Ответ 3

Прочитав несколько сообщений по этой теме, протестировав различные конфигурации и основываясь на некоторых выводах из этой темы об ошибках mysql, вот что я понял:


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

  • Системы часовых поясов GMT x UTC. GMT был задуман в конце 19 века и может быть сдвинут между стандартным и летним временем. это свойство может привести к ситуации, когда сервер базы данных переходит на летнее время, а приложение этого не замечает (возможно, есть другие сложности, но я не исследовал дальше). UTC не меняется с течением времени (он всегда находится примерно в пределах 1 секунды от среднего солнечного времени при 0 ° долготы).

  • Определение serverTimezone было введено в mysql jdbc connectors версии 5.1 вперед. до версии 8 это можно было игнорировать с помощью useLegacyDatetimeCode=true , что в сочетании с useJDBCCompliantTimezoneShift=true заставляло приложение получать часовой пояс базы данных при каждом подключении. В этом режиме часовые пояса GMT, такие как "Летнее британское время", будут преобразованы во внутренний формат java / JDBC. Новые часовые пояса могут быть определены в файле .properties, таком как этот

  • Начиная с версии драйвера jdbc 8, автоматическое сопоставление времени (useJDBCCompliantTimezoneShift) и устаревший формат времени (useLegacyDatetimeCode) были удалены (смотрите Журнал изменений mysql jdbc connector). поэтому установка этих 2 параметров не имеет эффекта, поскольку они полностью игнорируются (новое значение по умолчанию - useLegacyDateTimeCode=false)

  • Таким образом, настройка serverTimezone стала обязательной, если какой-либо из часовых поясов (серверов приложений / баз данных) не соответствует формату "UTC + xx" или "GMT + xx"

  • Установка серверного времени в качестве UTC (например, с помощью jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC) никак не влияет, даже если ваши серверы приложений / баз данных находятся не в этом часовом поясе. Важно, чтобы строка подключения приложения + база данных были синхронизированы с тем же часовым поясом. Другими словами, простая установка serverTimezone = UTC с другим часовым поясом на сервере базы данных приведет к сдвигу любых дат, извлеченных из базы данных

  • Часовой пояс MySQL по умолчанию можно установить на UTC + 0 с помощью файлов my.ini или my.cnf (windows / linux соответственно), добавив строку default-time-zone = '+00:00' (подробности в этом сообщении StackOverflow)

  • Базам данных, настроенным в AWS (amazon web services), автоматически присваивается время по умолчанию UTC + 0 (смотрите страницу справки AWS здесь)

Ответ 4

Если вы используете Maven, вы можете просто установить другую версию MySQL connector (у меня была такая же ошибка, поэтому я сменил с 6.0.2 на 5.1.39) в pom.xml:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>

Как сообщалось в других ответах, эта проблема была исправлена в версиях 6.0.3 или выше, поэтому вы можете использовать обновленную версию:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.3</version>
</dependency>

Maven автоматически перестроит ваш проект после сохранения pom.xml файла.

java mysql tomcat jdbc