如何在 Spring Boot 配置中设置正确的 MySQL JDBC 时区

新手上路,请多包涵

D B:

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

Spring Boot: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 中指定了 UTC。 Hikari 在初始化时是否读取了其他内容?

看起来很像 Hikari 忽略了数据库 url 中的服务器时区设置,而是使用我自己的机器的时区,恰好是“AEDT”(澳大利亚墨尔本)——这是不受欢迎的行为。我希望 Hikari 忽略我自己机器的时区。有谁知道如何让它做到这一点?

原文由 Michael Coxon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

感谢您的回答,但我已经找到了解决方案。

正如我所怀疑的那样,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;

一个有效的时区,并与基于云的实例同步。

我认为对于很多使用带有 Spring Boot 的 MySQL 的人来说,这是一个真正的陷阱。它可以在人们处于受支持的时区时工作,但是如果您的开发机器应该切换到不受支持的时区,它会非常神秘地中断,我很惊讶它没有在任何地方记录。 MySQL Connector/J 的源代码很明显,但你不会知道。

也许是因为 MySQL 是 5 年前的事了,而我是一个古老的化石,而且,好吧,离开我的草坪吧!

原文由 Michael Coxon 发布,翻译遵循 CC BY-SA 4.0 许可协议

设置 useLegacyDatetimeCode false 并设置 ServerTimezone。

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

原文由 GolamMazid Sajib 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏