2014-10-22 3 views
88

Некоторые фона:MySQL JDBC Driver 5.1.33 - Time Zone Issue

У меня есть 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. 

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

+0

Как выглядит ваш JDBC-URL? –

+0

Проверьте мой ответ https://stackoverflow.com/a/44720416/4592448. Я думаю, что его лучший ответ) – Fortran

ответ

140

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

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 
+1

Согласно [docs] (https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html) useJDBCCompliantTimezoneShift не влияет на использование useLegacyDatetimeCode = ложь. Поэтому он не нужен там ... – matof

+6

Это решает мою ошибку. Обратите внимание: бегите & с & в файле persistence.xml: <свойство name = "javax.persistence.jdbc.url" value = "jdbc: mysql: // localhost/test? UseUnicode = true & useJDBCCompliantTimezoneShift = true & useLegacyDatetimeCode = false & serverTimezone = UTC "/> – pdem

+2

Неправильно. Точка useLegacyDatetimeCode = false не должна указывать serverTimezone, поэтому клиент исправляет различия в часовых поясах. Это ошибка в этой версии клиента MySQL. – antgar9

20

Это ошибка в mysql-connector-java от версии 5.1.33 до 5.1.37. Я сообщил об этом здесь: http://bugs.mysql.com/bug.php?id=79343

Отредактировано: Это было исправлено с MySQL-разъем-Java 5.1.39

Это была опечатка в классе TimeUtil в методе loadTimeZoneMappings, что повышает NPE локацию /com/mysql/jdbc/TimeZoneMapping.properties. Если вы посмотрите на код, файл должен быть расположен в пределах класса TimeUtil погрузчиком, а не TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE); 

Параметр useLegacyDatetimeCode позволяет корректировать разницу между клиентскими и серверными часовых поясов автоматически при использовании даты. Таким образом, это помогает вам точно не указывать часовые пояса в каждой части. Несмотря на то, что параметр serverTimeZone является обходным решением, а между тем патч выпущен, вы можете попробовать лучше исправить код самостоятельно, как я.

  • Если это отдельное приложение, вы можете попробовать просто добавить исправленное ком/MySQL/JDBC/TimeUtil класса в код и быть осторожным с баночкой порядка загрузке. Это может помочь: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Если это веб-приложение, тем проще решение создать свой собственный MySQL-разъем-Java-5.1.37-patched.jar, заменяя .class непосредственно в оригинальную банку ,

+0

Сладкий, спасибо за сообщение об этом. Рад, что кто-то смог зафиксировать ошибку. Знаете ли вы, когда исправление будет выпущено? – bluecollarcoder

+0

Решение, которое вы предлагаете, замечательно, но я думаю, что изменение источника драйверов и управление зависимостью Maven, вероятно, слишком раздражает большинство людей. – bluecollarcoder

+0

Исправление уже совершено в своем репо, но не попало в последнюю версию 5.1.38. Они используют для выпуска каждые несколько месяцев, поэтому я надеюсь, что это может произойти в ближайшее время. Тем временем я могу загрузить вам свою банку, если вы этого захотите. – antgar9

35

Если вы используете Maven, вы можете просто установить другую версию соединителя MySQL (у меня была такая же ошибка, поэтому я изменился с 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 файл.

+11

Спасибо, решение работает. Они не исправили его в 6.0.3 – katamayros

+0

Я по-прежнему буду следовать этой теме, поэтому я могу обновить ее, когда ошибка будет исправлена ​​в новой версии. Спасибо от бразильского друга ура! –

+3

Мне потребовалось несколько ночей, чтобы попытаться выяснить проблему. Я должен изменить версию с 6.0.3 до 5.1.39, также в моем другом приложении Spring Boot, я должен ввести . 5.1.39 в pom.xml. Большое спасибо! – Janet

17

Строка соединения должна быть установлена ​​так:

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 

Если вы определяете соединение в xml файле (например, persistence.xml, standalone-full.xml, и т.д ..), вместо & вы должны использовать &amp; или используйте блок CDATA.

+1

Неправильно. Точка useLegacyDatetimeCode = false не должна указывать serverTimezone, поэтому клиент исправляет различия в часовых поясах. – antgar9

+0

добавив & работал для меня – user2478236

11

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

SET GLOBAL time_zone = '+3:00';

+0

, если вы используете часовой пояс MSK, это +3, тогда вы можете использовать в качестве адреса db: 'jdbc: mysql: // localhost/db? UseUnicode = true & useJDBCCompliantTimezoneShift = true & useLegacyDatetimeCode = false & serverTimezone = Европа/Москва '. Похоже, что mysql-коннектор не понимает короткие имена часовых поясов. – babay

1
  1. Я добавил в тузд конфигурационном файле в разделе [туздЫ]

    default_time_zone='+03:00' 
    
  2. И рестарта сервер MySQL:

    sudo service mysql restart 
    

Где +03: 00 мой часовой пояс UTC.

Путь к файлу конфигурации на моей ОС Ubuntu 16.04:

/etc/mysql/mysql.conf.d/mysqld.cnf 

ВНИМАНИЕ: ЕСЛИ ВАШЕ ВРЕМЯ многозональное летнее и зимнее время. ВЫ ДОЛЖНЫ ИЗМЕНИТЬ UTC В КОНФИГУКЕ, ЧТО ВРЕМЯ ИЗМЕНЕНИЯ. ДВАЖДЫ В ГОД (ПОСЛЕДУЮЩАЯ) ИЛИ УСТАНОВЛЕНА КРОНТАБА С СУДО.

Мой URL соединения JDBC:

"jdbc:mysql://localhost/java" 
+0

Необходимость перезапуска Mysql - это, как правило, нестартер практически во всех случаях использования. Это становится еще большей проблемой, когда речь идет о репликации. – bluecollarcoder

+0

@bluecollarcoder Требуется добавить только в раздел [mysqld]. Или добавьте раздел [mysqld], если он не имеет этого раздела. Пример моей конфигурации https://pastebin.com/j4F7t2KS – Fortran

1

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