MySQL JDBC Driver 5.1.33-проблема часового пояса

некоторые справочная информация:

У меня есть Java 1.6 webapp, работающий на Tomcat 7. База данных MySQL 5.5. Ранее я использовал MySQL JDBC driver 5.1.23 для подключения к БД. Все сработало. Недавно я обновил драйвер JDBC Mysql 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.

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

11 ответов


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

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

если вы используете 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 автоматически восстановит ваш проект после сохранения .


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

редактировать: Это было исправлено из mysql-connector-java 5.1.39

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

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

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

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

  • Если это веб-приложение, более простым решением является создание собственного mysql-connector-java-5.1.37-исправлено.банку, подставляя .класс напрямую в оригинальную банку.


строка подключения должна быть установлена следующим образом:

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

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


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

SET GLOBAL time_zone = '+3:00';


Я решил поставить ниже строки подключения в URL

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

У меня такая же проблема и я решил ее добавить только "?serverTimezone=UTC " для моего строкового соединения.

#

sinossi моя проблема:

java.язык SQL.SQLException: значение часового пояса сервера "CEST" не распознано или представляет более одного часового пояса. Необходимо настроить сервер или драйвер JDBC (с помощью свойства конфигурации serverTimezone), чтобы использовать более конкретное значение часового пояса, если вы хотите использовать поддержку часового пояса.

my dbDriver = com.mysql.jdbc.Driver

my jar = mysql-connector-java-8.0.12.jar

my java = 1.8

my tomcat = Apache Tomcat Version 8.5.32

my MySql server = MySql ver.8.0.12 

  1. я добавил в файл конфигурации mysql в разделе [mysqld]

    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 В CONFIG, ЕСЛИ ИЗМЕНИТЬ ВРЕМЯ. ДВАЖДЫ В ГОД (ОБЫЧНО) ИЛИ УСТАНОВИТЕ CRONTAB С КОМАНДА SUDO.

мой url JDBC соединение:

"jdbc:mysql://localhost/java"

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


У меня также была точно такая же проблема в базе LibreOffice. Поэтому я просто указал не "дневной часовой пояс" в строке подключения.
**enter image description here**

пробовал без "& serverTimezone=MST", но это также не удалось.

Я также попробовал "& serverTimezone=MDT", и это не удалось, поэтому по какой-то причине ему не нравится летнее время!


пакет pack1;

импорт java.язык SQL.Соединение; импорт java.язык SQL.DriverManager;

импорт пакета javax.качать.JOptionPane;

открытый класс sqliteConnection { Connection conn=null;

public static Connection dbConnector() {
    try {Class.forName("com.mysql.jdbc.Driver");

    Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306","root","");
    JOptionPane.showMessageDialog(null, "connection is succesful");
    return conn;

    }catch(Exception e) {
        JOptionPane.showMessageDialog(null, e);
        return null;

        ////you need also to execute this in database ===>     SET GLOBAL time_zone = '+3:00';
    }
}

}