【问题标题】:How to set correct MySQL JDBC timezone in Spring Boot configuration如何在 Spring Boot 配置中设置正确的 MySQL JDBC 时区
【发布时间】:2019-05-28 07:47:11
【问题描述】:

数据库:

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

【问题讨论】:

    标签: mysql spring-boot hikaricp


    【解决方案1】:

    设置useLegacyDatetimeCode false 并设置ServerTimezone。

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

    【讨论】:

    • 谢谢,但我已经试过了 - 没有任何效果。正如我所提到的,我不认为 Hikari 正在查看时区设置的连接字符串。此外,我认为useLegacyDatetimeCode 解决方法主要用于 Hibernate(我没有使用)
    • 我正在使用mysql 8.0.16,无法启动我的spring boot 应用程序抱怨时区,所以我尝试了上述设置并启动了应用程序。
    【解决方案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 年前的事,而我是一个古老的化石,而且,好吧,离开我的草坪吧!

    【讨论】:

      【解决方案3】:

      这对我有用。我在 application.properties 中设置了 db URL 中的变量:

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

      【讨论】:

      • 这是对我有用的。从来没有想过使用这种格式来指定时区!我用Australia/Melbourne
      • 很好的答案,如果有人想使用零时区,请将值设置为serverTimezone=Etc/UTC
      【解决方案4】:

      我在application.properties下的db url中添加了以下变量:

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

      Spring Boot 现在可以正常运行了。

      【讨论】:

        【解决方案5】:

        我正在使用 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::

        【讨论】:

        • 好东西......在所有这些答案中,我最喜欢这个。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          设置 useLegacyDatetimeCode false 对我有用。谢谢..

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

          【讨论】:

            【解决方案8】:

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

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

            在您的架构名称为我解决了这个问题之后。应该是这样的

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

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

            【讨论】:

              【解决方案9】:

              使用 jdk 14,我必须对我的 application.properties 执行此操作

              spring.jpa.properties.hibername.jdbc.time_zone=US/Michigan
              

              编辑:格式化

              【讨论】:

                【解决方案10】:

                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
                

                【讨论】:

                  【解决方案11】:

                  另一种方法是在文件application.properties中放入下一行:

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

                  它作为一个选项出现在:https://www.baeldung.com/mysql-jdbc-timezone-spring-boot

                  【讨论】:

                    【解决方案12】:

                    我尝试了 3 种方法。

                    1. TimeZone.setDefault(TimeZone.getTimeZone("Asia/Colombo")); // 在 Spring 初始化器中
                    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。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2012-01-16
                      • 1970-01-01
                      • 2017-03-16
                      • 2020-12-22
                      • 1970-01-01
                      • 2018-03-22
                      • 2021-02-21
                      • 2019-03-15
                      相关资源
                      最近更新 更多