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.xml
, standalone-full.xml
等),而不是&
你应该使用&
或使用CDATA
块。
我已经通过configurationMySQL解决了这个问题。
SET GLOBAL time_zone = '+3:00';
我解决了这个问题,没有任何单一的代码更改 只需转到系统时间设置并设置时区。 在我的情况下,默认的时区是UTC,我改变了我的本地时区。 我重新启动所有服务后,一切为我工作。
-
我在第[mysqld]部分的mysqlconfiguration文件中添加了
default_time_zone='+03:00'
-
并重启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"