【问题标题】:The server time zone value 'AEST' is unrecognized or represents more than one time zone服务器时区值“AEST”无法识别或代表多个时区
【发布时间】:2016-10-09 17:51:20
【问题描述】:

我正在尝试设置一个简单的休眠应用程序,当我运行它时,我得到一个充满错误的堆栈跟踪。

我的 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]]

编辑:

所以我查看了被标记的问题,并尝试更改我的连接字符串,但它仍然抛出相同的堆栈跟踪。以下是我的新连接网址。如您所见,我将 serverTimezone 更改为打印的 Timezone.getDefault()

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

【问题讨论】:

  • 它是否可以与其他连接器(如 C oder ODBC)一起使用?
  • 没试过?我将如何测试呢? @Michael-O
  • JDBC好像是最流行的?
  • 例如,在 PHP 或 Windows ODBC 或 unixODBC 中。客户端和服务器上的user.timezone(TimeZone.getDefault())属性是什么意思?
  • 您需要一个“真实”时区。 CEST(“中欧标准时间”)也是如此 - 在这里您必须决定欧洲/柏林或欧洲/巴黎等。对于 AEST,这似乎是澳大利亚/悉尼、澳大利亚/塔斯马尼亚或澳大利亚/维多利亚之一。

标签: java mysql hibernate maven


【解决方案1】:

尝试添加这些参数..

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

我正在使用 mysql-connector-java 6.0.4

【讨论】:

  • 这对我有用。我更新了我的 Spring application.properties 文件。不过,我想将其设置为我的本地时区(山地时间),并希望它足够聪明以处理夏令时(即,MDT 变为 MST 并在一年中再次返回)。
  • 这个参数也可以添加到phpStorm数据库管理器中进行连接。
  • 我将我的 Linux 服务器的 /etc/localtime 从 /usr/share/zoneinfo/US/Pacific 更新为 /usr/share/zoneinfo/America/Los_Angeles 然后重新启动了 mysql 服务,这为我解决了这个问题.
  • 我遇到了同样的问题,这篇文章解决了。无论如何,如果我在调试模式下启动应用程序,我有这个异常:“线程“主”com.mysql.cj.jdbc.exceptions.CommunicationsException 中的异常:通信链接失败最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包”。有什么想法吗?
【解决方案2】:

原来6.x 不兼容,转移到5.1.39 修复了它。

【讨论】:

【解决方案3】:

对于 AEDT,恕我直言,正确的解决方案是将 URL 更改如下,

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

【讨论】:

    【解决方案4】:
    jdbc:mysql://localhost:3306/fussa?useLegacyDatetimeCode=false&amp;serverTimezone=UTC
    

    使用&amp;amp; 而不是&amp;

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

    SET GLOBAL time_zone = '00:00'; 
    

    并查看当前设置:

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

    【讨论】:

    • @LawrenceDol 实际上你是不正确的。它嵌入在 XML 中,因此仍需要转义。
    【解决方案5】:

    抛出异常是因为 MySql 服务器时区(继承自系统时区)的格式与 mysql 连接器所期望的格式不同。您需要将 MySql 时区设置为“澳大利亚/悉尼”。详情请看这个很棒的回复:Should MySQL have its timezone set to UTC?

    • 用时区信息填充 mysql 架构:

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

    • 从mysql运行:

    SET GLOBAL time_zone = 'Australia/Sydney';

    • 重启mysql服务器

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        build.gradle >

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

        application.properties >

        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
        【解决方案8】:

        您好,您需要在您的 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;
            }
        

        在上面的代码中sn-p看看setUrl属性

        【讨论】:

          【解决方案9】:

          使用默认值

          Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/web_student_tracker?user=root&password=&useLegacyDatetimeCode=false&serverTimezone=UTC");
          

          【讨论】:

            【解决方案10】:

            如果您使用 Spring Boot,请尝试在 localhost 参数后添加一个问号:

            ?serverTimezone=UTC&useLegacyDatetimeCode=false
            

            例如,我有一个名为 springboottutorial 的 mysql 数据库。在此示例中,参数如下所示:

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

            【讨论】:

              【解决方案11】:

              在 MySQL 中:您可能会像以下用户一样:

              1. 第一个解决方案:serverTimezone=UTC添加到连接url

                spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
                
              2. 第二种解决方案: n MySQL my.ini 文件设置default-time-zone 值如下

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

              【讨论】:

                【解决方案12】:

                我遇到了类似的问题,我使用的是 mysql-connector-java 8.0.15(最新),但由于某些原因,它仍然给我一个时区错误,我将其更改为 mysql-connector-java 8.0.13 和就是这样做的。希望对你有用。

                【讨论】:

                  【解决方案13】:

                  我已通过在数据库名称后添加"?serverTimezone=America/Los_Angeles" 来解决此问题。我来自西海岸,我的区域名称是"America/Los_Angeles"。如果您不确定您的时区名称,请在 RHEL/UBUNTU/CENTOS 上运行以下命令

                  11:42 AM  ✔ user1 sfo-server1 Δ [~] Ω  timedatectl | grep "Time zone"
                         Time zone: America/Los_Angeles (PDT, -0700)
                  

                  解决方案:

                  jdbc_connection_string => "jdbc:mysql://localhost:3306/movielens**?serverTimezone=America/Los_Angeles**"
                  

                  【讨论】:

                    【解决方案14】:

                    加载时区数据后,

                    SET GLOBAL time_zone = 'Australia/Sydney';
                    

                    为我工作。

                    在我的情况下,我希望设置是持久的,但这些都不能让我保持时区,最后我去option in mysql doc 设置启动参数如下,

                    --default-time-zone=Australia/Sydney
                    

                    最常见的选项是在 my.cnf 中设置它,这对我也不起作用。

                    注意:我的是 CentOS 8 和 MySql 8

                    【讨论】:

                    • 先生,我需要联系您,在 CentOS 中需要一点帮助。能否请您在 Twitter @ankitmishraR 上私信我,或者给我一些可以与您交谈的内容。
                    【解决方案15】:

                    如果您使用的是 Docker,并且需要通过覆盖进行配置,请考虑对 TZ 进行“硬编码”以使其明确,例如:

                    version: '3'
                    services:
                      mysql:
                        environment:
                          - TZ=GMT+11:00
                          # - TZ=Australia/Melbourne
                    

                    编辑:实际上,虽然此配置不再引发错误,但 tomcat 正确解释了该值,而 mysql 将其解释为 GMT :(

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-09-06
                      • 2021-07-24
                      • 2020-04-16
                      • 1970-01-01
                      • 2019-12-04
                      • 2019-02-26
                      • 2020-03-05
                      相关资源
                      最近更新 更多