服务器时区值“AEST”无法识别或代表多个时区。

60

我正在尝试建立一个简单的Hibernate应用程序,但运行时出现了一堆错误的堆栈跟踪。

我在我的pom.xml文件中有以下Maven依赖项:

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.0.Final</version>
    </dependency>
    <!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.2</version>
    </dependency>

我本地运行的mysql版本是:

5.7.9, for osx10.11 (x86_64)

我正在运行一个看起来非常简单的方法,但仍然遇到错误:

// create session factory
SessionFactory factory = new Configuration()
            .configure("hibernate.cfg.xml")
            .addAnnotatedClass(Model.class)
            .buildSessionFactory();

// create session
Session session = factory.getCurrentSession();

Model newModel = new Model("....", "...", "...");

// start a transaction
session.beginTransaction();

// save the student object
System.out.println("Saving the model...");
session.save(newModel);

执行以上代码后,我得到了一长串的堆栈跟踪信息...System.out.println也没有输出...所以连接似乎并未成功建立。
INFO: HHH000115: Hibernate connection pool size: 1 (min=1)
Thu Jun 09 17:36:28 EST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:723)
    at com.parkingapi.tests.Test.main(Test.java:17)
Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:105)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:123)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.addConnections(PooledConnections.java:106)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:40)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:19)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections$Builder.build(PooledConnections.java:138)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:110)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:74)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
    ... 14 more
Caused by: java.sql.SQLException: The server time zone value 'AEST' 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.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:695)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:638)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:606)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:624)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:620)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:68)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1683)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:656)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:349)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
    ... 29 more
Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value 'AEST' 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at com.mysql.cj.jdbc.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:118)
    at com.mysql.cj.mysqla.MysqlaSession.configureTimezone(MysqlaSession.java:308)
    at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:2474)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1817)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1673)
    ... 33 more

我关注的是这里的错误信息:

服务器时区值“AEST”无法识别或表示多个时区。如果您想使用时区支持,则必须通过服务器或JDBC驱动程序(通过serverTimezone配置属性)配置更具体的时区值。

我不确定该如何解决?

编辑:

打印出时区 (System.out.println(TimeZone.getDefault());) 的输出如下所示:

sun.util.calendar.ZoneInfo[id="Australia/Melbourne",offset=36000000,dstSavings=3600000,useDaylight=true,transitions=142,lastRule=java.util.SimpleTimeZone[id=Australia/Melbourne,offset=36000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=3,endMonth=3,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]

编辑:

因此,我查看了被标记的问题,并尝试更改我的连接字符串,但仍然会抛出相同的堆栈跟踪。下面是我的新连接URL。您可以看到我将 serverTimezone 改为打印的 TimeZone.getDefault()

jdbc:mysql://localhost:3306/parking_hib?useLegacyDatetimeCode=false;serverTimezone=Australia/Melbourne;useSSL=false;

例如,在PHP或Windows ODBC或unixODBC中。客户端和服务器上的user.timezoneTimeZone.getDefault())属性是什么? - Michael-O
你需要一个“真正的”时区。对于CEST(“中欧标准时间”)也是如此 - 在这里,您必须决定使用Europe/Berlin还是Europe/Paris等。对于AEST,似乎应该选择Australia/Sydney、Australia/Tasmania或Australia/Victoria之一。 - René
可能是如何在Java连接中更改MySQL时区的重复问题。 - guido
可能是 https://dev59.com/vV8d5IYBdhLWcg3wt0Gy 的重复问题。 - René
@James111 你尝试过连接器的5.1.39版本吗?https://dev.mysql.com/doc/connector-j/6.0/en/connector-j-versions.html提到版本6是一个开发者里程碑... - René
显示剩余5条评论
16个回答

96

尝试添加这些参数...

jdbc:mysql://localhost:3306/fussa?useLegacyDatetimeCode=false&serverTimezone=UTC

我正在使用mysql-connector-java 6.0.4


2
这对我有用。我更新了我的Spring应用程序属性文件。我想将其设置为我的本地时区(Mountain Time),并希望它足够智能,可以处理夏令时(即,MDT在一年中变成MST,然后再变回MDT)。 - BikerJared
3
这个参数也可以添加到phpStorm数据库管理器中以建立连接。 - gael
我将Linux服务器的/etc/localtime从/usr/share/zoneinfo/US/Pacific更新为/usr/share/zoneinfo/America/Los_Angeles,然后重新启动了mysql服务,这解决了我的问题。 - vinnyjames
我曾经遇到过同样的问题,这篇文章解决了我的问题。但是,如果我在调试模式下启动应用程序,就会出现以下异常:“Exception in thread "main" com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server”。有什么想法吗? - Bia

26

事实证明,6.x版本不兼容,更改为5.1.39版本后问题得到解决。


1
升级到8.0.11版本也可以解决这个问题。 - Nikhil Sahu
Connector 8.0.15似乎出现了故障,需要以上修复。 - Volksman
1
8.0.23默认使用本地时区,因此默认情况下不会出现此问题 https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/news-8-0-23.html - Brecht Yperman

23

我认为对于AEDT来说,正确的解决方案是按照以下方式更改URL:

jdbc:mysql://localhost:3306/sampledb?serverTimezone=Australia/Sydney

6
jdbc:mysql://localhost:3306/fussa?useLegacyDatetimeCode=false&amp;serverTimezone=UTC

请使用&amp;代替&

您也可以尝试在mysql上更改时区:

SET GLOBAL time_zone = '00:00'; 

并查看当前设置:

SELECT @@global.time_zone, @@session.time_zone;

@LawrenceDol,实际上你是错误的。它嵌入在XML中,因此仍然需要转义。 - MikeKulls

4
异常被抛出是因为MySql服务器时区(继承自系统时区)与mysql连接器期望的格式不同。您需要将MySql时区设置为“澳大利亚/悉尼”。请查看此链接以获取详细信息。
  • 使用时区信息填充mysql模式:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

  • 从mysql运行:

SET GLOBAL time_zone = 'Australia/Sydney';

  • 重新启动mysql服务器

4

这是MySQLWorkbench版本的问题。请升级到最新版本8.0,然后在您的jdbc URL中添加serverTimezone=UTC。

String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC";


2
嗨,您需要在URL规定符中指定如下内容:
 @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/jpahibernate?useLegacyDatetimeCode=false&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("Password");
        return dataSource;
    }

在上面的代码片段中,请注意setUrl属性。最初的回答。

2

build.gradle >

compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.11'

应用程序属性 >

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

-

 mysql --version
 mysql  Ver 8.0.11 for osx10.13 on x86_64 (Homebrew)

这种组合对我很有效。

在我的环境中可以工作,在SpringBoot和mysql 8.0上。 - José Castillo

2
在MySQL中,您可以使用以下方式:
  1. First solution: add serverTimezone=UTC to connection url

    spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
    
  2. Second solution: n MySQL my.ini file set default-time-zone value bellow like

    # Set default time zone
    default-time-zone = '+08:00'
    

1
使用默认值。
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/web_student_tracker?user=root&password=&useLegacyDatetimeCode=false&serverTimezone=UTC");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接