MySQL JDBC驱动程序5.1.33 – 时区问题

一些背景:

我有一个运行在Tomcat 7上的Java 1.6 webapp。数据库是MySQL 5.5。 以前,我使用Mysql JDBC驱动程序5.1.23连接到数据库。 一切正常。 我最近升级到了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. 

为什么发生这种情况?

显然,为了使MySQL JDBC驱动程序的版本5.1.33能够与UTC时区一起工作,必须在连接string中明确指定serverTimezone

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

如果您使用的是Maven,则可以在pom.xml设置另一个MySQL连接器版本(我有同样的错误,所以我从6.0.2更改为5.1.39):

 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> 

正如在另一个答案中所报告的,这个问题已经在6.0.3或更高的版本中得到修复,所以你可以使用更新后的版本:

 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.3</version> </dependency> 

保存pom.xml文件后,Maven会自动重新构build项目。

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

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

这是loadTimeZoneMappings方法中的TimeUtil类中的一个错误,它引发了一个NPE定位/com/mysql/jdbc/TimeZoneMapping.properties文件。 如果您查看代码,该文件应位于TimeUtil类加载器中,而不是TimeZone:

 TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE); 

使用参数useLegacyDatetimeCode可以在使用date时自动更正客户端和服务器时区之间的差异。 所以它可以帮助您精确地不必在每个部分中指定时区。 虽然使用serverTimeZone参数是一个解决方法,同时补丁发布了,但是你可以像我一样尝试更好地修改代码。

  • 如果它是一个独立的应用程序,您可以尝试简单地向您的代码添加一个更正的com / mysql / jdbc / TimeUtil类,并小心jar加载顺序。 这可以帮助: https : //owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • 如果是Web应用程序,更简单的解决scheme是创build自己的mysql-connector-java-5.1.37-patched.jar,直接将.classreplace为原始jar。

连接string应该像这样设置:

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

如果你在xml文件中定义连接(比如persistence.xmlstandalone-full.xml等),而不是&你应该使用&amp; 或使用CDATA块。

我已经通过configurationMySQL解决了这个问题。

SET GLOBAL time_zone = '+3:00';

我解决了这个问题,没有任何单一的代码更改 只需转到系统时间设置并设置时区。 在我的情况下,默认的时区是UTC,我改变了我的本地时区。 我重新启动所有服务后,一切为我工作。

  1. 我在第[mysqld]部分的mysqlconfiguration文件中添加了

     default_time_zone='+03:00' 
  2. 并重启mysql服务器:

     sudo service mysql restart 

在哪里+03:00我的UTC时区。

在我的操作系统上configuration文件的pathubuntu 16.04:

 /etc/mysql/mysql.conf.d/mysqld.cnf 

警告:如果您的时区有夏季和冬季时间。 如果更改时间,您必须在configuration中更改UTC。 每年两次(通常)或设置与SUDO CRONTAB。

我的urljdbc连接:

 "jdbc:mysql://localhost/java"