471 Stimmen

MySQL JDBC Treiber 5.1.33 - Zeitzone Problem

Einige Hintergrundinformationen:

Ich habe eine Java 1.6 Webanwendung, die auf Tomcat 7 läuft. Die Datenbank ist MySQL 5.5. Zuvor habe ich den MySQL JDBC-Treiber 5.1.23 verwendet, um eine Verbindung zur Datenbank herzustellen. Alles hat funktioniert. Vor kurzem habe ich auf den MySQL JDBC-Treiber 5.1.33 aktualisiert. Nach dem Upgrade hat Tomcat diesen Fehler beim Starten der Anwendung ausgegeben.

WARNING: Unexpected exception resolving reference
java.sql.SQLException: Der Server-Zeitzone-Wert 'UTC' wird nicht erkannt oder repräsentiert
  mehr als eine Zeitzone. Sie müssen entweder den Server oder den JDBC-Treiber (über
  die serverTimezone-Konfigurationseigenschaft) konfigurieren, um einen genaueren Zeitzone-Wert zu verwenden, wenn
  Sie Zeitzonensupport nutzen möchten.

Warum passiert das?

38voto

ColdFire Punkte 1341

Es hat für mich funktioniert, indem ich einfach serverTimeZone=UTC zu application.properties hinzugefügt habe.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC

34voto

Ich habe das Problem gelöst, indem ich die Verbindungszeichenfolge unten im URL platziert habe

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

29voto

Aníbal Punkte 655

Dies ist ein Fehler im mysql-connector-java von Version 5.1.33 bis 5.1.37. Ich habe ihn hier gemeldet: http://bugs.mysql.com/bug.php?id=79343

Bearbeitet: Dies wurde ab mysql-connector-java 5.1.39 korrigiert

Es handelte sich um einen Tippfehler in der TimeUtil-Klasse in der loadTimeZoneMappings-Methode, der eine NPE auslöst, wenn die Datei /com/mysql/jdbc/TimeZoneMapping.properties gesucht wird. Wenn Sie den Code betrachten, sollte die Datei innerhalb des TimeUtil-Klassenladens und nicht im TimeZone liegen:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

Der Parameter useLegacyDatetimeCode ermöglicht es, den Unterschied zwischen Client- und Server-Zeitzonen automatisch zu korrigieren, wenn Daten verwendet werden. Dadurch wird vermieden, dass Sie die Zeitzonen in jedem Teil angeben müssen. Obwohl die Verwendung des Parameters serverTimeZone ein Workaround ist und in der Zwischenzeit ein Patch veröffentlicht wird, können Sie versuchen, den Code selbst zu korrigieren, so wie ich es gemacht habe.

  • Wenn es sich um eine eigenständige Anwendung handelt, können Sie einfach eine korrigierte com/mysql/jdbc/TimeUtil-Klasse zu Ihrem Code hinzufügen und darauf achten, dass die Reihenfolge des Jar-Ladens korrekt ist. Dies kann helfen: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Wenn es sich um eine Webanwendung handelt, ist die einfachere Lösung, Ihre eigene mysql-connector-java-5.1.37-patched.jar zu erstellen, wobei die .class direkt in das Original-Jar ersetzt wird.

27voto

Fortran Punkte 1702
  1. Ich habe in der MySQL-Konfigurationsdatei im Abschnitt [mysqld] hinzugefügt

    default_time_zone='+03:00'
  2. Und starten Sie den MySQL-Server neu:

    sudo service mysql restart

Wo +03:00 meine UTC-Zeitzone ist.

Pfad zur Konfigurationsdatei auf meinem Betriebssystem Ubuntu 16.04:

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

WARNUNG: WENN IHRE ZEITZONE SOMMER- UND WINTERZEIT HAT. MÜSSEN SIE UTC IN DER KONFIGURATION ÄNDERN, WENN SICH DIE ZEIT ÄNDERT. ZWEIMAL IM JAHR (MEISTENS) ODER SETZEN SIE CRONTAB MIT SUDO.

Meine URL-JDBC-Verbindung:

"jdbc:mysql://localhost/java"

18voto

Vishrant Punkte 12787

Ich habe folgendes auf meiner Datenbankseite ausgeführt.

mysql> SET @@global.time_zone = '+00:00';

mysql> SET @@session.time_zone = '+00:00';

mysql> SELECT @@global.time_zone, @@session.time_zone;

Ich verwende Server Version: 8.0.17 - MySQL Community Server - GPL

Quelle: https://community.oracle.com/thread/4144569?start=0&tstart=0

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X