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'(オーストラリア、メルボルン)である自分のマシンのタイムゾーンを使用するように見えますが、これは望ましくない動作です。ひかりに自分のマシンのタイムゾーンを無視して欲しい。それを行う方法を誰かが知っていますか?
あなたの答えをありがとう、しかし私は解決策を見つけました。
私が思ったように、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年前であり、私が古い化石であり、そしてまあ、ちょうど私の芝生を降りたからです!
useLegacyDatetimeCode
falseを設定します。
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
これでうまくいきました。 application.properties
のように、db URLに変数を設定します。
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=America/Los_Angeles
次の変数をapplication.properties
の下のdb urlに追加しました:
spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT-6
そしてSpring Bootは今や大丈夫です。
ショーンに続いて、これで十分でした:spring.datasource.url = jdbc:mysql:// $ {MYSQL_Host:localhost}:3306/DEMOS?serverTimezone = UTC
UseLegacyDatetimeCodeをfalseに設定すると、うまくいきます。ありがとう。
spring.datasource.url: jdbc:mysql://localhost:3306/employee_directory?
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
別の方法は、ファイルに入れることですapplication.properties
次の行:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
それはオプションで提供されます: https://www.baeldung.com/mysql-jdbc-timezone-spring-boot
追加 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