【问题标题】:SpringBoot Mysql Database Unable to open JDBC Connection for DDL executionSpringBoot Mysql 数据库无法打开 JDBC 连接进行 DDL 执行
【发布时间】:2019-02-09 13:56:41
【问题描述】:

我使用本地 h2 数据库运行我的应用程序。现在我想将它连接到一个在线 mysql 数据库。但是在尝试启动连接时,我多次收到com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,此外还有以下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1710) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1085) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:858) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1234) [spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at quiz.QuizAppMain.main(QuizAppMain.java:16) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.0.0.RELEASE.jar:2.0.0.RELEASE]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:970) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:895) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:57) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:388) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:377) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
... 21 common frames omitted
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:69) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcConnection(ImprovedExtractionContextImpl.java:60) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl.getJdbcDatabaseMetaData(ImprovedExtractionContextImpl.java:67) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTables(InformationExtractorJdbcDatabaseMetaDataImpl.java:329) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl.getTablesInformation(DatabaseInformationImpl.java:120) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:65) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:183) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:72) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
... 28 common frames omitted
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我在 pom.xml 中添加了以下内容:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
    </dependency>

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

这是我的 application.properties:

spring.datasource.url=jdbc:mysql://my.url.net:port
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.name=dbname
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

从 h2 更改为 mysql 时,我没有对源代码进行任何更改,因为我正在实现 CrudRepository,它也应该适用于 mysql。

您能否给我一些提示,可能缺少什么?我已经在 stackoverflow 上检查了类似的问题,但是在添加了几种解决方案之后(例如添加 hibernate.dialect 和 driver-class-name),我的应用程序仍然无法正常工作。

【问题讨论】:

    标签: mysql hibernate spring-boot


    【解决方案1】:
    # Allows Hibernate to generate SQL optimized for a particular DBMS
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    

    需要根据运行的mysql版本修改方言。

    MySql 5.5 - org.hibernate.dialect.MySQL55Dialect

    MySql 5.7 - org.hibernate.dialect.MySQL57Dialect

    MySql 8 - org.hibernate.dialect.MySQL8Dialect

    您可以使用此查询检查 MySql 版本

    SHOW VARIABLES LIKE "%version%";
    

    并检查 InnoDB 版本

    【讨论】:

      【解决方案2】:

      谢谢!!我遇到了同样的问题并使用您的答案解决了它:

      1) 首先我用

      检查了 MySql 版本

      显示变量,例如“%version%”;

      2) 然后用右边的修改方言:

      MySql 5.5 - org.hibernate.dialect.MySQL55Dialect

      MySql 5.7 - org.hibernate.dialect.MySQL57Dialect

      MySql 8 - org.hibernate.dialect.MySQL8Dialect

      它奏效了!

      【讨论】:

        【解决方案3】:

        将这些属性替换到您的 app.prop 文件中。

            # Connection url for the database "netgloo_blog"
        spring.datasource.url = jdbc:mysql://localhost:3306/your_db_name?useSSL=false
        
        # Username and password
        spring.datasource.username = username
        spring.datasource.password = password
        
        # Keep the connection alive if idle for a long time (needed in production)
        spring.datasource.testWhileIdle = true
        spring.datasource.validationQuery = SELECT 1
        
        # ===============================
        # = JPA / HIBERNATE
        # ===============================
        
        # Use spring.jpa.properties.* for Hibernate native properties (the prefix is
        # stripped before adding them to the entity manager).
        
        # Show or not log for each sql query
        spring.jpa.show-sql = true
        
        # Hibernate ddl auto (create, create-drop, update): with "update" the database
        # schema will be automatically updated accordingly to java entities found in
        # the project
        spring.jpa.hibernate.ddl-auto = update
        
        # Naming strategy
        spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
        
        # Spring data jpa Auditor <jpa:auditing auditor-aware-ref="customAuditorAware"/>
        # Allows Hibernate to generate SQL optimized for a particular DBMS
        spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
        

        【讨论】:

        • 非常感谢您的回答!但遗憾的是,我仍然遇到同样的例外情况。所以也许我在 pom.xml 或源代码中遗漏了一些东西?
        • 你在用springboot、spring-data-jpa和mysql数据库吗?
        • 我在 pom.xml 中包含了 spring-boot-starter-data-jpa、jaxb-api 和 mysql-connector-java
        • 是的,还是同样的错误。但也许还有其他问题。感谢您检查我的代码!我想我会问那个维护数据库的人。
        【解决方案4】:

        数据源网址应该是:

        spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
        

        【讨论】:

          【解决方案5】:

          只需将以下行添加到您的项目属性文件中。

          spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
          

          【讨论】:

            【解决方案6】:

            我知道这是一个旧线程。只是更新这个以防其他人面临同样的问题。

            如错误消息 - org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution 中所述,这是一个通用 JDBC 异常,与听起来不同,这并不总是意味着它无法建立连接。

            就我而言,我使用不同的数据源和 H2 进行单元测试等。我发现我在 H2 DB 模式创建命令中给出了错误的类路径。如果在 H2 启动时创建表时出现任何查询错误,也会生成同样的错误消息。

            对此的最佳解决方案是在调试模式下运行它并找出导致此问题的原因。

            【讨论】:

            • 为了这个问题,我认为这个答案需要更深入。也许您的消息更适合作为评论。
            • 我知道。但是我还没有足够的声誉来评论其他任何人的帖子/答案。 :P
            猜你喜欢
            • 1970-01-01
            • 2019-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-13
            • 2014-12-09
            • 2021-06-15
            • 1970-01-01
            相关资源
            最近更新 更多