背景知识:
我有一个运行在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.
为什么会这样?
这是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
放进原来的罐子里。
如果你使用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将自动重新构建项目。