Драйвер 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 в строке подключения.
Прочитав несколько сообщений по этой теме, протестировав различные конфигурации и основываясь на некоторых выводах из этой темы об ошибках 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: