DB:
$ mysql --version
mysql Ver 14.14 Distrib 5.6.27, for osx10.10 (x86_64) using EditLine wrapper
Spring Boot: 2.1.1.RELEASE
L'erreur:
2019-01-01 15:56:25.849 ERROR 39957 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
> :bootRun
Java.sql.SQLException: The server time zone value 'AEDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
Parties pertinentes de mon fichier de propriétés:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC
spring.datasource.username=#####
spring.datasource.password=########
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
Ce que je trouve étrange à ce sujet, c'est que l'erreur indique que le fuseau horaire utilisé est AEDT, et pourtant j'ai spécifié UTC dans le spring.datasource.url
. Hikari lit-il autre chose lors de son initialisation?
Cela ressemble beaucoup à Hikari ignore le paramètre de fuseau horaire du serveur dans l'URL de la base de données en faveur de l'utilisation du fuseau horaire de ma propre machine qui se trouve être 'AEDT' (Melbourne, Australie) - Il s'agit d'un comportement indésirable. J'aimerais que Hikari ignore le fuseau horaire de ma propre machine. Est-ce que quelqu'un sait comment faire ça?
Merci pour vos réponses, mais j'ai trouvé la solution.
Comme je le soupçonnais, Hikari ignore tout ce que vous mettez dans l'url de la source de données (donc désolé les gars, peu importe ce que vous y mettez), essentiellement, il lit le paramètre de fuseau horaire de MySQL lui-même, c'est-à-dire quel que soit le résultat que vous voyez lors de l'émission la commande
SELECT @@GLOBAL.time_zone;
dans MySQL. Dans mon cas, le résultat a été "SYSTEM", quelle que soit la machine locale sur laquelle il s'est installé. C'était AEDT, qui n'est pas pris en charge par le pilote MySQL et donc mon exception.
L'exécution de cette même requête dans AWS a donné la valeur "UTC", qui est prise en charge (et, en fait, ce que je voulais).
Par conséquent, j'ai dû définir le fuseau horaire sur mon serveur MySQL local.
Tout d'abord, j'ai dû charger les fuseaux horaires disponibles de mon hôte (Mac OS X) dans MySQL. J'ai dû trouver où se trouvait le fichier zoneinfo (/ usr/share/zoneinfo dans mon cas) puis découvrir où se trouvait l'utilitaire `mysql_tzinfo_to_sql '(répertoire bin de l'installation MySQL) et l'utiliser pour charger les fuseaux horaires pris en charge par ma machine locale . Sous Mac OS X, j'ai fini par exécuter la commande:
/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Ensuite, dans MySQL, je pouvais exécuter la commande
SET GLOBAL time_zone = UTC;
ceci est un fuseau horaire valide et est synchronisé avec les instances basées sur le cloud.
Je pense que c'est un véritable piège pour beaucoup de gens qui utilisent MySQL avec Spring Boot. Cela fonctionnera pendant que les gens sont dans les fuseaux horaires pris en charge, mais si votre machine de développement doit basculer vers un fuseau horaire non pris en charge, il se brisera mystérieusement, je suis surpris qu'il ne soit documenté nulle part. Le code source du connecteur MySQL/J le rend évident, mais vous ne le sauriez pas autrement.
C'est peut-être parce que MySQL est juste il y a 5 ans, et je suis un vieux fossile et, et bien, je descends de ma pelouse!
Définissez useLegacyDatetimeCode
false.
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
Cela a fonctionné pour moi. J'ai défini la variable dans l'URL db comme telle dans application.properties
:
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=America/Los_Angeles
J'ai ajouté la variable suivante dans l'url db sous application.properties
:
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT-6
et Spring Boot fonctionne maintenant correctement.
Après Shaun, cela me suffisait: spring.datasource.url = jdbc: mysql: // $ {MYSQL_Host: localhost}: 3306/DEMOS? serverTimezone = UTC
Set useLegacyDatetimeCode false fonctionne pour moi. Merci..
spring.datasource.url: jdbc:mysql://localhost:3306/employee_directory?
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
Une autre façon consiste à mettre dans le fichier application.properties
la ligne suivante:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
Il est disponible en option dans: https://www.baeldung.com/mysql-jdbc-timezone-spring-boot
Ajouter useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false
à votre chaîne de connexion:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC