Einige Hintergrundinformationen:
Ich habe eine Java 1.6-Webanwendung unter Tomcat 7. 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. Ich habe kürzlich ein Upgrade auf den MySQL-JDBC-Treiber 5.1.33 durchgeführt. Nach dem Upgrade würde Tomcat diesen Fehler beim Starten der App auslösen.
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.
Warum passiert dies?
Antworten:
Um Version 5.1.33 des MySQL JDBC-Treibers für die Arbeit mit der UTC-Zeitzone zu verwenden, muss der Wert
serverTimezone
explizit in der Verbindungszeichenfolge angegeben werden.quelle
Ich habe dieses Problem durch die Konfiguration von MySQL gelöst.
SET GLOBAL time_zone = '+3:00';
quelle
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Es sieht so aus, als ob mysql-connector kurze Zeitzonennamen nicht versteht.Nachdem ich mehrere Beiträge zu diesem Thema gelesen, verschiedene Konfigurationen getestet und einige Erkenntnisse aus diesem MySQL-Bug-Thread gewonnen habe , habe ich Folgendes verstanden:
useLegacyDatetimeCode=true
, wodurchuseJDBCCompliantTimezoneShift=true
die Anwendung in Verbindung mit die Datenbankzeitzone für jede Verbindung abrufen würde. In diesem Modus werden GMT-Zeitzonen wie "British Summer Time" in das interne Java / JDBC-Format konvertiert. Neue Zeitzonen könnten in einer .properties-Datei wie dieser definiert werdenuseJDBCCompliantTimezoneShift
) und das Legacy-Zeitformat (useLegacyDatetimeCode
) entfernt ( siehe Änderungsprotokoll zum MySQL-JDBC-Connector ). Daher hat das Einstellen dieser beiden Parameter keine Auswirkung, da sie vollständig ignoriert werden (neuer Standardwert istuseLegacyDateTimeCode=false
)serverTimezone
wurde obligatorisch , wenn eine der Zeitzonen (application / Datenbank - Server) sind nicht im Format ‚UTC + xx‘ oder ‚GMT + xx‘jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, auch wenn sich Ihre Anwendungs- / Datenbankserver nicht in dieser Zeitzone befinden. Wichtig ist, dass die Anwendungsverbindungszeichenfolge + Datenbank mit derselben Zeitzone synchronisiert wird. Mit anderen Worten , einfach serverTimezone Einstellung = UTC mit einer anderen Zeitzone auf dem Datenbank - Server werden alle Termine verschieben aus der Datenbank extrahiertdefault-time-zone='+00:00'
(Details in diesem StackOverflow-Beitrag ).quelle
default-time-zone = '+00:00'
in die Homebrew-/usr/local/etc/my.cnf
Datei aufzunehmen. Es scheint jedoch, dass die Leerzeichen um das=
Feld wichtig sind, sodass Sie das Aufzählungszeichen möglicherweise bearbeiten können, um sie einzuschließen.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 geändert) in
pom.xml
:Wie in anderen Antworten angegeben, wurde dieses Problem in Version 6.0.3 oder höher behoben, sodass Sie die aktualisierte Version verwenden können:
Maven erstellt Ihr Projekt automatisch neu, nachdem Sie die
pom.xml
Datei gespeichert haben.quelle
6.0.6
still behoben . besser die obige Lösung zu verwendenDie Verbindungszeichenfolge sollte wie folgt eingestellt werden:
Wenn Sie die Verbindung in einer definiere
xml
Datei (wiepersistence.xml
,standalone-full.xml
, etc ..), statt&
Sie verwenden sollen ,&
einen oder verwendenCDATA
Block.quelle
Dies ist ein Fehler in mysql-connector-java von Version 5.1.33 bis 5.1.37. Ich habe es hier gemeldet: http://bugs.mysql.com/bug.php?id=79343
Bearbeitet: Dies wurde aus mysql-connector-java 5.1.39 korrigiert
Es war ein Tippfehler in der TimeUtil-Klasse in der loadTimeZoneMappings-Methode, der eine NPE auslöst, die die Datei /com/mysql/jdbc/TimeZoneMapping.properties findet. Wenn Sie sich den Code ansehen, sollte sich die Datei im TimeUtil-Klassenladeprogramm befinden, nicht in TimeZone:
Mit dem Parameter useLegacyDatetimeCode kann der Unterschied zwischen Client- und Server-Zeitzonen bei Verwendung von Datumsangaben automatisch korrigiert werden. So können Sie nicht in jedem Teil Zeitzonen angeben. Obwohl die Verwendung des Parameters serverTimeZone eine Problemumgehung darstellt und der Patch veröffentlicht wird, können Sie versuchen, den Code besser selbst zu korrigieren, als ich es getan habe.
Wenn es sich um eine eigenständige Anwendung handelt, können Sie einfach versuchen, Ihrem Code eine korrigierte com / mysql / jdbc / TimeUtil-Klasse hinzuzufügen, und mit der Reihenfolge des Ladens der JARs vorsichtig sein. Dies kann helfen: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Wenn es sich um eine Webanwendung handelt, besteht die einfachere Lösung darin, eine eigene mysql-connector-java-5.1.37-patched.jar zu erstellen und die .class direkt in die ursprüngliche JAR-Datei zu ersetzen.
quelle
TimeZone.getAvailableIDs()
noch in enthalten,TimeZoneMapping.properties
sodass diese Lösung hier nicht hilft. Die Lösung würde wahrscheinlich wie folgt eingestellt werdenserverTimezone=Europe/Berlin
Ich habe das Einfügen der folgenden Verbindungszeichenfolge in die URL gelöst
quelle
Es funktionierte für mich nur durch Hinzufügen von serverTimeZone = UTC auf application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
quelle
Ich habe in der MySQL-Konfigurationsdatei im Abschnitt [MySQL] hinzugefügt.
Und starten Sie den MySQL-Server neu:
Wobei +03: 00 meine UTC-Zeitzone.
Pfad zur Konfigurationsdatei auf meinem Betriebssystem Ubuntu 16.04:
WARNUNG: WENN IHRE ZEITZONE SOMMER- UND WINTERZEIT HAT. SIE MÜSSEN UTC IN KONFIG ÄNDERN, WENN SIE DIE ZEIT ÄNDERN. ZWEIMAL IM JAHR (normalerweise) ODER CRONTAB MIT SUDO EINSTELLEN.
Meine URL jdbc Verbindung:
quelle
default-time-zone='+03:00'
stattdessen gemäß dieser Antwort . Kommt auch von DBeaver.Ich habe das gleiche Problem und habe es gelöst. Hänge nur "? ServerTimezone = UTC" an meine String-Verbindung an.
#sinossi mein problem:
java.sql.SQLException: Der Server-Zeitzonenwert 'CEST' wird nicht erkannt oder repräsentiert mehr als eine Zeitzone. Sie müssen entweder den Server oder den JDBC-Treiber (über die Konfigurationseigenschaft serverTimezone) so konfigurieren, dass ein spezifischerer Zeitzonenwert verwendet wird, wenn Sie die Zeitzonenunterstützung verwenden möchten.
quelle
Das obige Programm erzeugt diesen Zeitzonenfehler.
Nach Ihrem Datenbanknamen müssen Sie Folgendes hinzufügen :
?useTimezone=true&serverTimezone=UTC
. Sobald Sie fertig sind, funktioniert Ihr Code einwandfrei.Viel Glück :)
quelle
Ich habe folgendes auf meiner Datenbankseite ausgeführt.
Ich verwende die Serverversion: 8.0.17 - MySQL Community Server - GPL
Quelle: https://community.oracle.com/thread/4144569?start=0&tstart=0
quelle
Alles, was wir brauchen, um das Problem zu beheben
serverTimezone
:quelle
Sie können den MySQL-Connector in der Maven-Abhängigkeit verwenden.
Dann müssen Sie die richtigen Parameter in der
application.properties
Datei einstellen ,quelle
Ich benutze mysql-connector-java-8.0.13 und hatte das gleiche Problem. Ich habe meine Datenbank in der Befehlszeilenkonsole erstellt und dieses Problem mithilfe der Lösung von @Dimitry Rud in der Befehlszeile gelöst :
Ich musste nichts neu starten, die Zeit einstellen und meinen Code sofort in Eclipse ausführen, es war ohne Probleme verbunden.
Der Fehler sollte in einer älteren Version behoben sein, aber ich glaube, ich habe diesen Fehler erhalten, weil ich ihn nach dem Erstellen der Datenbank in der Konsole nicht festgelegt habe. Ich verwende weder die Workbench noch eine andere App, um dies zu verwalten, sondern die Konsole.
quelle
Führen Sie in der MySQL-Workbench die folgenden SQL-Anweisungen aus:
Überprüfen Sie mit den folgenden SQL-Anweisungen, ob die Werte festgelegt wurden:
SELECT @@ global.time_zone, @@ session.time_zone;
quelle
Das hat bei mir funktioniert.
unter DBeaver 6.0: Gehen Sie zu Verbindungseinstellungen> Treibereigenschaften> Serverzeitzone> UTC festlegen.
Außerdem musste im Frühjahr die Boot-Konfiguration die folgende Eigenschaft festlegen.
jdbc: mysql: // localhost: /? serverTimezone = UTC
quelle
Damit Version 5.1.33 des MySQL JDBC-Treibers mit der UTC-Zeitzone funktioniert, muss die serverTimezone offenbar explizit in der Verbindungszeichenfolge angegeben werden.
quelle
Ich hatte auch genau das gleiche Problem in LibreOffice Base. Daher habe ich in der Verbindungszeichenfolge nur eine Zeitzone angegeben, die nicht der Sommerzeit entspricht.
Ich habe es ohne versucht "& serverTimezone = MST" aber das ist auch fehlgeschlagen.
Ich habe auch "& serverTimezone = MDT" ausprobiert und das ist fehlgeschlagen. Aus irgendeinem Grund mag es keine Sommerzeit!
quelle
Ich hatte das gleiche Problem, als ich versuchte, mit einem Spring Boot-Projekt unter Windows zu arbeiten.
Die Datenquellen-URL sollte lauten:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
quelle
Führen Sie die folgende Abfrage für die MySQL-Datenbank aus, um den Fehler zu beheben
quelle
Ich habe einen ähnlichen Fehler wie Sie erhalten, aber mein Wert für die Server-Zeitzone ist 'Afr. centrale Ouest ', also habe ich diese Schritte gemacht:
MyError (in der IntelliJ IDEA Community Edition):
Dieses Problem trat auf, als ich meinen MySQL-Server auf SQL Server 8.0 (MYSQL80) aktualisierte.
Die einfachste Lösung für dieses Problem besteht darin, den folgenden Befehl in Ihre MYSQL Workbench zu schreiben:
Der Wert nach der Zeitzone entspricht GMT +/- Differenz in Ihrer Zeitzone. Das obige Beispiel gilt für Nordafrika (GMT + 1: 00) / oder für Indien (GMT + 5: 30). Es wird das Problem lösen.
Geben Sie den folgenden Code in Ihre MySQL Workbench ein und führen Sie die Abfrage aus
[Quelllink für Frage / Problem]
[Quelllink zur Antwort]
[Lösungs-Screenshot]
quelle
Dies ist eigentlich die Lösung für dieses Problem, aber kopieren Sie es nicht einfach und fügen Sie es in Ihr Programm ein. Wenn Sie nur die Zeile lesen, finden Sie 'resultout', das ist der Name meiner Datenbank, und Sie müssen Ihre schreiben.
Es gibt drei Zeichenfolgenkomponenten: Die erste ist die URL, die zweite der Benutzername und die dritte das Kennwort. Im obigen Absatz haben wir die URL gelöscht. Die zweite und dritte String-Komponente wie Ihr Benutzername und Passwort müssen Sie entsprechend ändern.
Vielen Dank
quelle
Ich habe dieses Problem ohne einzelne Codeänderung gelöst. Gehen Sie einfach zur Systemzeiteinstellung und stellen Sie die Zeitzone ein. In meinem Fall war die Standardzeitzone UTC, die ich in meine lokale Zeitzone geändert habe. Nachdem ich alle Dienste neu gestartet hatte, funktionierte alles für mich.
quelle
Ich bin spät dran, aber wenn Sie sich durch den folgenden Fehler kämpfen und die Datenquelle (javax.sql.DataSource) verwenden:
Setzen Sie die folgende Zeile, um den Fehler zu beheben:
quelle
In meinem Fall war es eine Testumgebung und ich musste eine vorhandene Anwendung erstellen, damit sie ohne Konfigurationsänderungen und wenn möglich ohne MySQL-Konfigurationsänderungen funktioniert. Ich konnte das Problem beheben, indem ich dem Vorschlag von @vinnyjames folgte und die Server-Zeitzone auf UTC änderte :
Das war genug für mich, um das Problem zu lösen.
quelle
Ich habe meiner
/etc/mysql/my.cnf
Datei die folgende Zeile hinzugefügt :Neustart des MySQL-Servers:
Und es funktioniert wie ein Zauber.
quelle
Stimmen Sie der Antwort von @bluecollarcoder zu, aber es ist besser, sie
TimeZone.getDefault().getID();
am Ende der Verbindungszeichenfolge zu verwenden:In diesem Fall wird der
Timezone
Parameter abhängig von der Zeitzone des lokalen Computers automatisch aktualisiert.quelle
Ändern Sie einfach die Verbindungszeichenfolge mit dem folgenden Code in der Datei application.properties.
quelle
Das Festlegen der Serverzeit als UTC (z. B. mit) hat keine Auswirkungen
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, auch wenn sich Ihre Anwendungs- / Datenbankserver nicht in dieser Zeitzone befinden. Wichtig ist, dass die Anwendungsverbindungszeichenfolge + Datenbank mit derselben Zeitzone synchronisiert wird.Mit anderen Worten, durch einfaches Festlegen
serverTimezone=UTC
einer anderen Zeitzone auf dem Datenbankserver werden alle aus der Datenbank extrahierten Daten verschobenquelle