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

时间:2019-01-01 05:24:10

标签: mysql spring-boot hikaricp

数据库:

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

Spring Boot:2.1.1.Rosease

错误:

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忽略我自己机器的时区。有谁知道如何做到这一点?

12 个答案:

答案 0 :(得分:3)

useLegacyDatetimeCode设置为false。

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

答案 1 :(得分: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年前,而我是一个古老的化石,而且,好吧,就从我的草坪上走下来吧!

答案 2 :(得分:2)

这对我有用。我在application.properties中这样设置数据库URL中的变量:

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

答案 3 :(得分:1)

我在application.properties下的数据库URL中添加了以下变量:

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

并且Spring Boot现在可以正常运行。

答案 4 :(得分:1)

将useLegacyDatetimeCode设置为false对我有用。谢谢。

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

答案 5 :(得分:1)

在肖恩之后,这对我来说已经足够了: spring.datasource.url = jdbc:mysql:// $ {MYSQL_HOST:localhost}:3306 / DEMOS? serverTimezone = UTC

答案 6 :(得分:1)

使用jdk 14,我必须对我的application.properties

执行此操作
spring.jpa.properties.hibername.jdbc.time_zone=US/Michigan

编辑:格式化

答案 7 :(得分:1)

我遇到了同样的问题,但是添加了

?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

在您的架构名称为我解决了此问题之后。应该看起来像这样

spring.datasource.url = jdbc:mysql://localhost:3306/my-schema-name?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

我目前正在使用MySQL v8,这对我来说很好。

答案 8 :(得分:1)

我正在使用MySQL 8,并通过注入 user.timezone 属性的值解决了这个问题。

在我的项目中使用Java 8。

appliction.properties中的相关设置:

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.datasource.url=jdbc:mysql://localhost:3306/mudi?serverTimezone=${user.timezone}

使用2.3.4.RELEASE作为父项目。

使用的依赖项:

  • spring-boot-starter-thymeleaf
  • spring-boot-starter-web
  • spring-boot-devtools
  • spring-boot-starter-test
  • junit-vintage-engine
  • spring-boot-starter-data-jpa
  • mysql-connector-java

HTH,

WB ::

答案 9 :(得分:0)

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

答案 10 :(得分:0)

另一种方法是将文件application.properties下一行:

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

它是https://www.baeldung.com/mysql-jdbc-timezone-spring-boot

中的一个选项

答案 11 :(得分:0)

我尝试了 3 种方法。

  1. TimeZone.setDefault(TimeZone.getTimeZone("Asia/Colombo")); // 在 Spring Initializer 中
  2. spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Colombo // 在applications.properties
  3. -Duser.timezone=Asia/Colombo //在POM文件中设置属性

我也尝试通过 JDBC URL 设置属性;

  • useLegacyDatetimeCode=false
  • serverTimezone=亚洲/科伦坡

以上都不适合我。我注意到最不可能的嫌疑人 Jackson 覆盖了我的时区。

spring.jackson.time-zone=Asia/Colombo (The Answer)

在您的 application.properties 中包含它(仅此一项就足够了)

在 Spring boot - 2.1.5.RELEASE 、MYSQL8 上测试。