Pilote JDBC MySQL 5.1.33 Temps Question de la Zone
Un peu de contexte:
J'ai la version 1.6 de Java webapp en cours d'exécution sur Tomcat 7. La base de données est MySQL 5.5. Auparavant, j'ai été en utilisant le pilote JDBC Mysql 5.1.23 pour se connecter à la DB. Tout a fonctionné. J'ai récemment mis à jour de pilote JDBC Mysql 5.1.33. Après la mise à niveau, Tomcat serait de se débarrasser de cette erreur lors du démarrage de l'application.
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.
Pourquoi est-ce arrivé?
- Quel est votre URL JDBC ressembler?
- Vérifier ma réponse stackoverflow.com/a/44720416/4592448. Je pense que sa meilleure réponse)
Vous devez vous connecter pour publier un commentaire.
Apparemment, pour obtenir la version 5.1.33 de pilote JDBC MySQL pour fonctionner avec l'heure UTC de la zone, on doit spécifier le
serverTimezone
explicitement dans la chaîne de connexion.?serverTimezone=UTC
il était.J'ai résolu ce problème par la configuration de MySQL.
SET GLOBAL time_zone = '+3:00';
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Il ressemble à mysql-connector ne comprends pas court fuseau horaire noms.Si vous utilisez Maven, vous pouvez simplement mettre un autre connecteur MySQL version (j'ai eu le même message d'erreur, donc j'ai changé de 6.0.2 pour 5.1.39) dans
pom.xml
:Comme indiqué dans un autre réponses, ce problème a été corrigé dans les versions 6.0.3 ou plus, de sorte que vous pouvez utiliser la version mise à jour:
Maven sera automatiquement re-construire votre projet une fois que vous enregistrez le
pom.xml
fichier.6.0.6
encore. mieux utiliser la solution ci-dessusLa chaîne de connexion doit être définie comme ceci:
Si vous définissez la connexion dans un
xml
fichier (commepersistence.xml
,standalone-full.xml
, etc..), au lieu de&
vous devez utiliser&
ou utiliser unCDATA
bloc.C'est un bug de mysql-connector-java à partir de la version 5.1.33 à 5.1.37.
J'ai signalé ici: http://bugs.mysql.com/bug.php?id=79343
Modifié:
Cela a été corrigé à partir de mysql-connector-java 5.1.39
C'était une faute de frappe dans TimeUtil classe dans loadTimeZoneMappings méthode qui soulève un NPE localisation /com/mysql/jdbc/TimeZoneMapping.fichier de propriétés. Si vous regardez le code, le fichier doit être situé à l'intérieur de TimeUtil chargeur de classe, pas Fuseau horaire:
Le paramètre useLegacyDatetimeCode permet de corriger la différence entre le client et le serveur fuseaux horaires automatiquement lors de l'utilisation de dates. Donc il vous aide à precissely de ne pas avoir à spécifier les fuseaux horaires dans chaque partie. Malgré l'aide de serverTimeZone paramètre est une solution de contournement, et en attendant le patch est sorti, vous pouvez essayer de mieux corriger le code par vous-même comme je l'ai fait.
Si c'est une application autonome, vous pouvez essayer simplement d'ajouter un
corrigé com/mysql/jdbc/TimeUtil classe à votre code et être prudent
jar ordre de chargement. Cela peut aider:
https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Si c'est une application web, la solution plus simple pour créer votre propre
mysql-connector-java-5.1.37-patched.jar en substituant à la .classe directement
dans le pot d'origine.
TimeZone.getAvailableIDs()
ni dansTimeZoneMapping.properties
donc cette solution ne va pas aider ici. La solution serait probaby être commeserverTimezone=Europe/Berlin
8.0.15
trop. Donc, j'ai rétrogradé mon connecteur fichier jar àmysql-connector-java-5.1.47.jar
et je l'ai résolu. Comme indiqué dans cette réponse, j'ai utilisé le5.1.47
version (après5.1.39
version) et il s'est résolu.J'ai résolu en mettant en dessous de la chaîne de connexion dans l'URL
Après lecture de plusieurs posts sur ce sujet, tester différentes configurations et basée sur des idées de ce bug mysql fil c'est ce que j'ai compris:
useLegacyDatetimeCode=true
, qui, en conjonction avecuseJDBCCompliantTimezoneShift=true
en ferait la demande obtenir la base de données de fuseau horaire sur chaque connexion. Dans ce mode, l'heure GMT zones comme les "British Summer Time" serait converti à l'intérieur java/JDBC format. Nouveaux fuseaux horaires pourraient être définis dans un .fichier de propriétés telles que cette uneuseJDBCCompliantTimezoneShift
) et de l'héritage format de l'heure (useLegacyDatetimeCode
) ont été supprimés (voir jdbc mysql connector changelog). par conséquent, la définition de ces 2 paramètres n'a pas d'effet car ils sont complètement ignorés (nouvelle valeur par défaut estuseLegacyDateTimeCode=false
)serverTimezone
est devenu obligatoire si toutes les zones (applications/serveurs de base de données) ne sont pas au format UTC+xx " ou "GMT+xx'jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, même si votre application de base de données sur les serveurs ne sont pas dans ce fuseau horaire. L'important est pour l'application de la chaîne de connexion + base de données pour être synchronisé avec le même fuseau horaire. Dans des mots différents, simplement réglage serverTimezone=UTC avec un fuseau horaire différent sur le serveur de base de données vont changer toutes les dates extraites de la base de donnéesdefault-time-zone='+00:00'
(plus de détails dans cette StackOverflow post)default-time-zone = '+00:00'
dans le homebrew/usr/local/etc/my.cnf
fichier. Il semble que les espaces autour de la=
sont importantes, mais vous pouvez modifier la balle pour les inclure.Il a travaillé pour moi en ajoutant simplement des serverTimeZone=UTC sur demande.les propriétés.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
J'ai le même problème et je l'ai résolu ajouter que "?serverTimezone=UTC" à ma chaîne de connexion.
#
sinossi mon problème:
java.sql.SQLException: La zone serveur de temps de la valeur 'CEST' est méconnu ou représente plus d'un fuseau horaire. Vous devez configurer le serveur ou le pilote JDBC (via le serverTimezone propriété de configuration) à utiliser une certaine valeur de fuseau horaire, si vous voulez utiliser le temps de la zone de soutien.
J'ai ajouté en mysql fichier de configuration dans la section [mysqld]
Et redémarrer le serveur mysql:
Où +03:00 mon fuseau horaire UTC.
Chemin d'accès au fichier de config sur mon système d'exploitation ubuntu 16.04:
AVERTISSEMENT: SI VOTRE FUSEAU HORAIRE ONT ÉTÉ ET EN HIVER. VOUS DEVEZ MODIFIER L'UTC DANS LA CONFIGURATION, SI LE TEMPS DE CHANGEMENT. DEUX FOIS DANS L'ANNÉE(GÉNÉRALEMENT) OU DE L'ENSEMBLE CRONTAB AVEC SUDO.
Mon url de connexion jdbc:
default-time-zone='+03:00'
au lieu de cela, en tant que par cette réponse. Provenant également de DBeaver.Tout ce que nous devons résoudre le problème avec
serverTimezone
:Je suis en utilisant mysql-connector-java-8.0.13 et avait le même problème.
J'ai créé ma base de données dans la console de ligne de commande et résolu ce problème en utilisant @Dimitry Rud du solution sur la ligne de commande:
Je n'ai pas besoin de redémarrer quoi que ce soit, régler l'heure et a immédiatement exécuter mon code dans eclipse, il est connecté avec pas de problèmes.
Le bug est censé être corrigé dans une version plus ancienne, mais je pense que j'ai eu cette erreur, car après, j'ai créé la base de données dans la console, je n'ai pas mis cette. Je ne suis pas à l'aide du workbench, ni d'une autre application pour gérer ce processus, plutôt que de la console.
Le programme ci-dessus va générer le fuseau horaire erreur.
Après votre nom de base de données, vous devez ajouter ceci:
?useTimezone=true&serverTimezone=UTC
. Une fois que vous avez fait votre code fonctionne très bien.Bonne chance 🙂
Cela a fonctionné pour moi.
sur DBeaver 6.0 : Accédez aux Paramètres de Connexion > Propriétés du Pilote > fuseau Horaire du Serveur > Set UTC.
Aussi, au printemps, la configuration de démarrage, a créé, en dessous de la propriété.
jdbc:mysql://localhost:/?serverTimezone=UTC
De mysql workbench exécuter les instructions sql suivantes:
avec les instructions sql suivantes vérifier si les valeurs ont été définies:
SELECT @@global.time_zone, @@session.time_zone;
Vous pouvez utiliser le MySQL connector dans la dépendance Maven,
Ensuite, vous devez le définir les paramètres dans la
application.properties
fichier,J'ai aussi été d'avoir exactement le même problème dans LibreOffice Base. Alors j'ai juste spécifié non 'daylight savings time zone' dans la chaîne de connexion.
J'ai essayé sans le "&serverTimezone=MST" mais qui a échoué en tant que bien.
J'ai aussi essayé le "&serverTimezone=MDT" et qui a échoué, si pour une raison quelconque, il n'aime pas l'heure d'été!
J'ai résolu ce problème sans aucun changement de code. juste goto système de réglage de l'heure et de définir le fuseau horaire. Dans mon cas, le défaut de fuseau horaire est UTC qui j'ai changé mon fuseau horaire local. Après je n'ai redémarrer tous les services, tout a fonctionné pour moi.
Je suis en retard, Mais Si vous avez du mal par la suite à l'erreur et à l'aide de la source de données(javax.sql.Source de données):
Jeu ligne suivante pour se débarrasser de l'erreur:
J'ai eu le même problème lorsque j'essaie de travailler avec le printemps de démarrage du projet sur windows.
Url de la source de données doit être:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
D'accord avec @bluecollarcoder réponse, mais il est préférable d'utiliser
TimeZone.getDefault().getID();
à la fin de la chaîne de connexion:Dans ce cas
Timezone
paramètre automatiquement les mises à jour en fonction de la machine locale du fuseau horaire.Dans mon cas, c'était un environnement de test et j'ai dû faire une application existante pour fonctionner sans aucune modification de la configuration, et si possible sans MySQL les modifications de configuration.
J'ai été en mesure de résoudre le problème en suivant @vinnyjames suggestion et changer de serveur fuseau horaire UTC:
Faisant cela m'a suffit à résoudre le problème.
J'ai aussi eu le même cours d'exécution java JDBC dans NetBeans. C'est la façon dont il fixe
J'utilise Xampp. Dans le bouton conf d'Apache, j'ai ouvert httpd.fichier conf et sur la première ligne j'ai tapé
En conf bouton de MySQL, j'ai ouvert ma.fichier ini et sur la dernière ligne j'ai tapé
"Europe/Athens"
Arrêté et a commencé à la fois Apache et MySQL
Problème résolu.
*(Local mechine fuseau horaire est différent, mais pas de problème.)