Niektóre tło:
Mam webapp Java 1.6 działający na Tomcat 7. Baza danych to MySQL 5.5. Wcześniej korzystałem ze sterownika JDBC Mysql 5.1.23, aby połączyć się z bazą danych. Wszystko działało Niedawno zaktualizowałem sterownik Mysql JDBC 5.1.33. Po aktualizacji Tomcat zgłasza ten błąd podczas uruchamiania aplikacji.
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.
Dlaczego to się dzieje?
Odpowiedzi:
Najwyraźniej, aby uzyskać wersję 5.1.33 sterownika MySQL JDBC do pracy ze strefą czasową UTC, należy wyraźnie to określić
serverTimezone
w ciągu połączenia.źródło
Rozwiązałem ten problem, konfigurując MySQL.
SET GLOBAL time_zone = '+3:00';
źródło
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Wygląda na to, że mysql-connector nie rozumie krótkich nazw stref czasowych.Po przeczytaniu kilku postów na ten temat, przetestowaniu różnych konfiguracji i na podstawie pewnych spostrzeżeń z tego wątku błędu mysql zrozumiałem:
useLegacyDatetimeCode=true
, co w połączeniu zuseJDBCCompliantTimezoneShift=true
aplikacją spowodowałoby, że aplikacja otrzymywałaby strefę czasową bazy danych dla każdego połączenia. W tym trybie strefy czasowe GMT, takie jak „British Summer Time”, zostałyby przekonwertowane na wewnętrzny format Java / JDBC. Nowe strefy czasowe można zdefiniować w pliku .properties, takim jak tenuseJDBCCompliantTimezoneShift
) i starszy format czasu (useLegacyDatetimeCode
) zostały usunięte ( patrz dziennik zmian złącza mysql złącza jdbc ). dlatego ustawienie tych 2 parametrów nie ma wpływu, ponieważ są one całkowicie ignorowane (nowa wartość domyślna touseLegacyDateTimeCode=false
)serverTimezone
stało się obowiązkowe, jeśli którakolwiek ze stref czasowych (serwery aplikacji / baz danych) nie ma formatu „UTC + xx” lub „GMT + xx”jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, nawet jeśli serwery aplikacji / bazy danych nie znajdują się w tej strefie czasowej. Ważne jest, aby parametry połączenia aplikacji + baza danych były synchronizowane z tą samą strefą czasową. Innymi słowy , po prostu ustawienie serverTimezone = UTC z inną strefą czasową na serwerze bazy danych spowoduje przesunięcie dowolnych dat wyodrębnionych z bazy danychdefault-time-zone='+00:00'
(szczegóły w tym poście StackOverflow )źródło
default-time-zone = '+00:00'
w/usr/local/etc/my.cnf
pliku homebrew . Wydaje się, że spacje wokół=
są ważne, więc możesz edytować ten punkt , aby je uwzględnić.Jeśli używasz Maven, możesz po prostu ustawić inną wersję konektora MySQL (miałem ten sam błąd, więc zmieniłem z 6.0.2 na 5.1.39) w
pom.xml
:Jak podano w innych odpowiedziach, ten problem został rozwiązany w wersji 6.0.3 lub nowszej, dzięki czemu można użyć zaktualizowanej wersji:
Maven automatycznie odbuduje projekt po zapisaniu
pom.xml
pliku.źródło
6.0.6
Still. lepiej skorzystać z powyższego rozwiązaniaParametry połączenia powinny być ustawione w następujący sposób:
Jeśli definiujesz połączenia w
xml
pliku (takie jakpersistence.xml
,standalone-full.xml
itd ..), zamiast&
należy użyć&
lub użyćCDATA
bloku.źródło
Jest to błąd w mysql-connector-java od wersji 5.1.33 do 5.1.37. Zgłosiłem to tutaj: http://bugs.mysql.com/bug.php?id=79343
Edytowano: poprawiono to w mysql-connector-java 5.1.39
Była to literówka w klasie TimeUtil w metodzie loadTimeZoneMappings, która podnosi plik lokalizujący /com/mysql/jdbc/TimeZoneMapping.properties NPE. Jeśli spojrzysz na kod, plik powinien znajdować się w module ładującym klasy TimeUtil, a nie TimeZone:
Parametr useLegacyDatetimeCode pozwala automatycznie korygować różnicę między strefami czasowymi klienta i serwera podczas korzystania z dat. Pomaga to precyzyjnie nie określać stref czasowych w każdej części. Chociaż użycie parametru serverTimeZone jest obejściem problemu, a tymczasem łatka zostaje wydana, możesz spróbować poprawić kod samodzielnie, tak jak ja.
Jeśli jest to samodzielna aplikacja, możesz po prostu dodać poprawioną klasę com / mysql / jdbc / TimeUtil do swojego kodu i uważaj na kolejność ładowania słoika. Może to pomóc: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Jeśli jest to aplikacja internetowa, łatwiejszym rozwiązaniem jest utworzenie własnego mysql-connector-java-5.1.37-patched.jar, podstawiając klasę .class bezpośrednio do oryginalnego słoika.
źródło
TimeZone.getAvailableIDs()
ani w,TimeZoneMapping.properties
więc to rozwiązanie nie pomoże tutaj. Rozwiązaniem byłoby prawdopodobnie ustawienie jakserverTimezone=Europe/Berlin
Rozwiązałem wstawianie poniżej ciągu połączenia w adresie URL
źródło
Działa to dla mnie tylko przez dodanie serverTimeZone = UTC w application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
źródło
Dodałem w pliku konfiguracyjnym mysql w sekcji [mysqld]
I zrestartuj serwer mysql:
Gdzie +03: 00 moja strefa czasowa UTC.
Ścieżka do pliku konfiguracyjnego w moim systemie operacyjnym Ubuntu 16.04:
OSTRZEŻENIE: JEŻELI W SWOJEJ STREFIE CZASU JEST CZAS LETNI I ZIMOWY MUSISZ ZMIENIĆ UTC W KONFIGURACJI JEŻELI ZMIANA CZASU. Dwa razy w roku (zwykle) lub ustaw CRONTAB w SUDO.
Moje połączenie jdbc z url:
źródło
default-time-zone='+03:00'
zamiast tego, zgodnie z tą odpowiedzią . Pochodzi również z DBeaver.Mam ten sam problem i rozwiązałem go, dodając tylko „? ServerTimezone = UTC” do mojego połączenia łańcuchowego.
#sinossi mój problem:
java.sql.SQLException: Wartość strefy czasowej serwera „CEST” jest nierozpoznana lub reprezentuje więcej niż jedną strefę czasową. Musisz skonfigurować serwer lub sterownik JDBC (za pośrednictwem właściwości konfiguracyjnej serverTimezone), aby używał bardziej szczegółowej wartości strefy czasowej, jeśli chcesz korzystać z obsługi strefy czasowej.
źródło
Powyższy program wygeneruje błąd strefy czasowej.
Po nazwie bazy danych trzeba dodać to:
?useTimezone=true&serverTimezone=UTC
. Po zakończeniu kod będzie działał poprawnie.Powodzenia :)
źródło
Wykonałem następujące po mojej stronie bazy danych.
Używam wersji serwerowej: 8.0.17 - Serwer społeczności MySQL - GPL
źródło: https://community.oracle.com/thread/4144569?start=0&tstart=0
źródło
Wszystko, czego potrzebujemy, aby rozwiązać problem
serverTimezone
:źródło
Możesz użyć łącznika MySQL w zależności Maven,
Następnie potrzebujesz ustawić odpowiednie parametry w
application.properties
pliku,źródło
Używam mysql-connector-java-8.0.13 i miałem ten sam problem. Utworzyłem moją bazę danych w konsoli wiersza poleceń i rozwiązałem ten problem, używając rozwiązania @Dimitry Rud w wierszu polecenia:
Nie musiałem niczego ponownie uruchamiać, ustawiać czasu i natychmiast uruchamiać mój kod w zaćmieniu, co wiązało się bez żadnych problemów.
Błąd powinien zostać naprawiony w starszej wersji, ale myślę, że dostałem ten błąd, ponieważ po utworzeniu bazy danych w konsoli nie ustawiłem tego. Nie używam środowiska roboczego ani innej aplikacji do zarządzania tym, a nie konsoli.
źródło
Z mysql workbench uruchom następujące instrukcje SQL:
za pomocą następujących instrukcji SQL sprawdź, czy wartości zostały ustawione:
WYBIERZ @@ global.time_zone, @@ session.time_zone;
źródło
To zadziałało dla mnie.
w DBeaver 6.0: Wybierz Ustawienia połączenia> Właściwości sterownika> Strefa czasowa serwera> Ustaw UTC.
Ponadto w konfiguracji rozruchu wiosennego musiałem ustawić poniżej właściwości.
jdbc: mysql: // localhost: /? serverTimezone = UTC
źródło
Najwyraźniej, aby uzyskać wersję 5.1.33 sterownika MySQL JDBC do pracy ze strefą czasową UTC, należy wyraźnie określić parametr serverTimezone w ciągu połączenia.
źródło
Miałem również ten sam problem w bazie LibreOffice. Więc właśnie podałem „ciąg czasu letniego” w ciągu połączenia.
Próbowałem bez „& serverTimezone = MST”, ale to też się nie udało.
Próbowałem też „& serverTimezone = MDT” i to się nie udało, więc z jakiegoś powodu nie lubi czasu letniego!
źródło
Miałem ten sam problem, gdy próbowałem pracować z projektem wiosennego rozruchu w systemie Windows.
Adres URL źródła danych powinien być:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
źródło
Uruchom poniżej zapytania do mysql DB, aby rozwiązać błąd
źródło
Mam błąd podobny do twojego, ale mój Wartość strefy czasowej serwera to „Afr. centrale Ouest ”, więc wykonałem następujące kroki:
MyError (w IntelliJ IDEA Community Edition):
Napotkałem ten problem, kiedy uaktualniłem mój serwer mysql do SQL Server 8.0 (MYSQL80).
Najprostszym rozwiązaniem tego problemu jest napisanie poniższego polecenia w MYSQL Workbench -
Wartość po strefie czasowej będzie równa GMT +/- Różnica w strefie czasowej. Powyższy przykład dotyczy Afryki Północnej (GMT + 1: 00) / lub Indii (GMT + 5: 30). To rozwiąże problem.
Wprowadź następujący kod w swoim Mysql Workbench i wykonaj zapytanie
[link źródłowy do pytania / problemu]
[link źródłowy do odpowiedzi]
[Rozwiązanie ScreenShot]
źródło
To jest właściwie rozwiązanie tego problemu, ale nie kopiuj go i wklej w swoim programie. Jeśli po prostu przeczytasz wiersz, znajdziesz „wynik”, to jest nazwa mojej bazy danych i musisz napisać swoją.
Istnieją trzy komponenty łańcuchowe, pierwszy to url, drugi to nazwa użytkownika, a trzeci to hasło. W powyższym akapicie wyczyściliśmy adres URL. Drugi i trzeci komponent String, jak powiedział twoja nazwa użytkownika i hasło, musisz odpowiednio zmienić.
Dzięki
źródło
Rozwiązałem ten problem bez żadnej zmiany kodu. właśnie ustawiłem czas systemowy i ustawiłem strefę czasową. W moim przypadku domyślną strefą czasową była UTC, którą zmieniłem na lokalną strefę czasową. Po ponownym uruchomieniu wszystkich usług wszystko działało dla mnie.
źródło
Jestem spóźniony, ale jeśli walczysz z następującym błędem i używasz źródła danych (javax.sql.DataSource):
Ustaw następujący wiersz, aby pozbyć się błędu:
źródło
W moim przypadku było to środowisko testowe i musiałem sprawić, aby istniejąca aplikacja działała bez żadnych zmian konfiguracji, a jeśli to możliwe, bez żadnych zmian konfiguracji MySQL. Byłem w stanie rozwiązać ten problem, postępując zgodnie z sugestią @vinnyjames i zmieniając strefę czasową serwera na UTC :
Wystarczyło mi to, aby rozwiązać problem.
źródło
Dodałem następujący wiersz do mojego
/etc/mysql/my.cnf
pliku:Zrestartował serwer MySQL:
I działa jak urok.
źródło
Zgadzam się z odpowiedzią @bluecollarcoder, ale lepiej jest użyć
TimeZone.getDefault().getID();
na końcu ciągu połączenia:W takim przypadku
Timezone
parametr jest aktualizowany automatycznie w zależności od strefy czasowej lokalnego komputera.źródło
Wystarczy zmodyfikować ciąg połączenia za pomocą następującego kodu w pliku application.properties.
źródło
Nie ma wpływu na ustawienie czasu serwera jako UTC (na przykład z
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, nawet jeśli serwery aplikacji / bazy danych nie znajdują się w tej strefie czasowej. Ważne jest, aby parametry połączenia aplikacji + baza danych były synchronizowane z tą samą strefą czasową.Innymi słowy, po prostu ustawienie
serverTimezone=UTC
innej strefy czasowej na serwerze bazy danych spowoduje przesunięcie dat wyodrębnionych z bazy danychźródło