web-dev-qa-db-ja.com

Spring Boot構成で正しいMySQL JDBCタイムゾーンを設定する方法

DB:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.27, for osx10.10 (x86_64) using  EditLine wrapper

春のブーツ:2.1.1.RELEASE

エラー:

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.

私のプロパティファイルの関連部分:

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

これについて私が奇妙に思うのは、エラーがAEDTで使用されているタイムゾーンであることを示しているにもかかわらず、spring.datasource.url。ひかりは初期化時に他の何かを読みますか?

ひかりがデータベースURLのサーバーのタイムゾーン設定を無視して、たまたま 'AEDT'(オーストラリア、メルボルン)である自分のマシンのタイムゾーンを使用するように見えますが、これは望ましくない動作です。ひかりに自分のマシンのタイムゾーンを無視して欲しい。それを行う方法を誰かが知っていますか?

16
Michael Coxon

あなたの答えをありがとう、しかし私は解決策を見つけました。

私が思ったように、HikariはデータソースURLに入力したものはすべて無視します(ごめんなさい、そこに何を入力してもかまいません)。基本的に、MySQL自体からタイムゾーン設定を読み取ります。つまり、発行時に表示される結果はすべてコマンド

SELECT @@GLOBAL.time_zone;

mySQLで。私の場合、結果は "SYSTEM"でした。これは、ローカルマシンが設定したものです。これはAEDTでしたが、これはMySQLドライバーでサポートされていないため、私の例外です。

これと同じクエリをAWSで実行すると、値「UTC」が得られました。これはサポートされています(実際、私が欲しかったものです)。

そのため、ローカルのMySQLサーバーでタイムゾーンを設定する必要がありました。

まず、使用可能なタイムゾーンをホスト(Mac OS X)からMySQLにロードする必要がありました。私はzoneinfoファイルがどこにあるか(私の場合は/ usr/share/zoneinfo)、次にmysql_tzinfo_to_sqlユーティリティがどこにあるか(MySQLインストールのbinディレクトリ)を見つけ、それを使用してローカルマシンでサポートされているタイムゾーンをロードする必要がありました。 。 Mac OS Xでは、次のコマンドを実行してしまいました。

/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

次に、MySQLでコマンドを実行できます

SET GLOBAL time_zone = UTC;

this isは有効なタイムゾーンであり、クラウドベースのインスタンスと同期されます。

これは、MySQLをSpring Bootで使用する多くの人々にとって、本当の罠だと思います。サポートされているタイムゾーンにいる人でも機能しますが、開発マシンがサポートされていないタイムゾーンに切り替わると、不思議なことに壊れてしまい、どこにも記載されていないことに驚いています。 MySQL Connector/Jのソースコードはそれを明白にしますが、他の方法ではそれを知らないでしょう。

たぶんそれはMySQLがちょうど5年前であり、私が古い化石であり、そしてまあ、ちょうど私の芝生を降りたからです!

8
Michael Coxon

useLegacyDatetimeCode falseを設定します。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
9

これでうまくいきました。 application.propertiesのように、db URLに変数を設定します。

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=America/Los_Angeles
8
Shaun Dashjian

次の変数をapplication.propertiesの下のdb urlに追加しました:

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT-6

そしてSpring Bootは今や大丈夫です。

4
M. Lopez

ショーンに続いて、これで十分でした:sp​​ring.datasource.url = jdbc:mysql:// $ {MYSQL_Host:localhost}:3306/DEMOS?serverTimezone = UTC

1
Dimitri Flores

UseLegacyDatetimeCodeをfalseに設定すると、うまくいきます。ありがとう。

spring.datasource.url: jdbc:mysql://localhost:3306/employee_directory? 
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
1
Numery

別の方法は、ファイルに入れることですapplication.properties次の行:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

それはオプションで提供されます: https://www.baeldung.com/mysql-jdbc-timezone-spring-boot

0
Marsh Rangel

追加 useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=falseを接続文字列に:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
0
user7294900