背景知识:

我有一个运行在Tomcat 7上的Java 1.6 web应用程序。数据库为MySQL 5.5。之前,我使用Mysql JDBC驱动程序5.1.23连接到DB。一切工作。我最近升级到Mysql JDBC驱动程序5.1.33。升级后,Tomcat在启动应用程序时会抛出这个错误。

WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents
  more than one timezone. You must configure either the server or JDBC driver (via
  the serverTimezone configuration property) to use a more specifc timezone value if
  you want to utilize timezone support.

为什么会这样?


当前回答

我只需要在application.properties上添加serverTimeZone=UTC就可以了。 spring.datasource.url = jdbc: mysql: / / localhost / db吗?serverTimezone = UTC

其他回答

这是mysql-connector-java从5.1.33到5.1.37版本的一个错误。 我已经在这里报告了:http://bugs.mysql.com/bug.php?id=79343

编辑: 这已经从mysql-connector-java 5.1.39修正

这是在loadtimezonemapping方法中的TimeUtil类中出现的一个拼写错误,该方法会引发NPE定位/com/mysql/jdbc/TimeZoneMapping。属性文件。如果你看一下代码,文件应该位于TimeUtil类装入器中,而不是TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

参数useLegacyDatetimeCode允许在使用日期时自动纠正客户端和服务器时区之间的差异。因此,它帮助您精确地不必在每个部分指定时区。虽然使用serverTimeZone参数是一种变通方法,并且在发布补丁的同时,您可以像我一样尝试自己更正代码。

如果它是一个独立的应用程序,您可以尝试简单地添加 纠正com/mysql/jdbc/TimeUtil类到你的代码,要小心 与罐子装载顺序。这可以帮助: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html 如果它是一个web应用程序,更简单的解决方案是创建自己的应用程序 Mysql-connector-java-5.1.37-patched.jar,直接替换。class 放进原来的罐子里。

显然,要使MySQL JDBC驱动程序5.1.33版本与UTC时区兼容,必须在连接字符串中显式指定serverTimezone。

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

my.ini

最后加上这一行:

default-time-zone = '+05:30'

从终端运行此命令

>> sudo mysql -e "SET GLOBAL time_zone = ‘+5:30’;" -u root
>> sudo mysql -e "SELECT @@global.time_zone;" -u root

如果两者都不工作,请尝试使用终端从sqoop使用此请求

>> sqoop list-databases --connect "jdbc:mysql://localhost/employees?serverTimezone=UTC" --username sqoop -P

或者你可以用这个替换你的请求URL

jdbc:mysql://localhost/employees?serverTimezone=UTC

连接字符串为我工作这个

jdbc: mysql: / / localhost / < yourDbName > ?useUnicode = true&useJDBCCompliantTimezoneShift = true&useLegacyDatetimeCode = false&serverTimezone = UTC

我使用Gradle我的构建。Gradle文件是这样的

dependencies {
    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
    implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.17'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

在我的例子中,它是一个测试环境,我必须让一个现有的应用程序在没有任何配置更改的情况下工作,如果可能的话,没有任何MySQL配置更改。 我能够通过遵循@vinnyjames的建议并将服务器时区更改为UTC来修复这个问题:

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
service mysqld restart

这样做对我来说已经足够解决问题了。