470 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?

830voto

bluecollarcoder Punkte 14009

Anscheinend muss man zur Verwendung der MySQL JDBC-Treiber-Version 5.1.33 mit der UTC-Zeitzone explizit serverTimezone im Verbindungsstring angeben.

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

148voto

Dmitriy Rud Punkte 1489

Ich habe dieses Problem gelöst, indem ich MySQL konfiguriert habe.

SET GLOBAL time_zone = '+3:00';

82voto

epol Punkte 1042

Nachdem ich mehrere Beiträge zu diesem Thema gelesen habe, verschiedene Konfigurationen getestet habe und auf einigen Erkenntnissen aus diesen MySQL-Bug-Thread basiere, habe ich folgendes verstanden:

  • Die Server-Zeitzone ist insbesondere wichtig, um Daten, die in der Datenbank gespeichert sind, in die Zeitzone des Anwendungsservers umzuwandeln. Es gibt auch andere Auswirkungen, aber dies ist die auffälligste.
  • GMT x UTC-Zeitzonen. GMT wurde Ende des 19. Jahrhunderts konzipiert und kann zwischen Standardzeit und Sommerzeit verschoben werden. Diese Eigenschaft könnte dazu führen, dass der Datenbankserver auf Sommerzeit umstellt und die Anwendung es nicht bemerkt (vielleicht gibt es weitere Komplikationen, aber ich habe nicht weiter recherchiert). UTC variiert im Laufe der Zeit nicht (es liegt immer etwa 1 Sekunde vor der mittleren Sonnenzeit am Längengrad 0).
  • Die serverTimeZone-Definition wurde in den MySQL JDBC-Verbindern ab Version 5.1 eingeführt. Bis zur Version 8 konnte sie mit useLegacyDatetimeCode=true ignoriert werden, was in Verbindung mit useJDBCCompliantTimezoneShift=true dazu führen würde, dass die Anwendung bei jeder Verbindung die Zeitzone der Datenbank erhält. In diesem Modus würden GMT-Zeitzonen wie 'British Summer Time' in das interne Java/JDBC-Format umgewandelt. Neue Zeitzonen könnten in einer .properties-Datei wie diese definiert werden.
  • Ab der JDBC-Treiber-Version 8 wurden die automatische Zeitanpassung (useJDBCCompliantTimezoneShift) und das legacy-Zeitformat (useLegacyDatetimeCode) entfernt (siehe das Changelog des MySQL JDBC-Treibers). Daher haben das Setzen dieser 2 Parameter keine Auswirkungen, da sie komplett ignoriert werden (neuer Standard ist useLegacyDateTimeCode=false).
  • Auf diese Weise wurde das Setzen von serverTimezone obligatorisch, wenn eine der Zeitzonen (Anwendungs-/Datenbankserver) nicht im Format 'UTC+xx' oder 'GMT+xx' ist.
  • Es hat keine Auswirkungen, die Serverzeit als UTC festzulegen (zum Beispiel mit jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC), auch wenn Ihre Anwendungs-/Datenbankserver nicht in dieser Zeitzone sind. Wichtig ist, dass der Verbindungsstring der Anwendung + Datenbank mit derselben Zeitzone synchronisiert ist. Mit anderen Worten, das einfache Festlegen von serverTimezone=UTC mit einer anderen Zeitzone auf dem Datenbankserver verschiebt alle aus der Datenbank extrahierten Daten.
  • Die Standard-Zeitzone von MySQL kann in den my.ini- oder my.cnf-Dateien auf UTC+0 gesetzt werden, indem die Zeile hinzugefügt wird default-time-zone = '+00:00' (Details in diesem StackOverflow-Beitrag).
  • Datenbanken, die auf AWS (Amazon Web Services) konfiguriert sind, erhalten automatisch die Standardzeit UTC+0 (siehe AWS-Hilfeseite hier).

55voto

Wenn Sie Maven verwenden, können Sie einfach eine andere MySQL-Connector-Version festlegen (Ich hatte den gleichen Fehler, also habe ich von 6.0.2 auf 5.1.39 gewechselt) in pom.xml:

    mysql
    mysql-connector-java
    5.1.39

Wie in anderen Antworten berichtet wurde, wurde dieses Problem in den Versionen 6.0.3 oder höher behoben, also können Sie die aktualisierte Version verwenden:

    mysql
    mysql-connector-java
    6.0.3

Maven wird Ihr Projekt automatisch neu erstellen, nachdem Sie die Datei pom.xml gespeichert haben.

42voto

Alireza Alallah Punkte 2410

Die Verbindungszeichenfolge sollte wie folgt festgelegt werden:

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

Wenn Sie die Verbindung in einer xml-Datei (wie z.B. persistence.xml, standalone-full.xml, etc..) definieren, anstelle von & sollten Sie & verwenden oder einen CDATA-Block verwenden.

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