无法配置数据源:未指定“url”属性,并且无法配置嵌入式数据源。原因:发

Posted

技术标签:

【中文标题】无法配置数据源:未指定“url”属性,并且无法配置嵌入式数据源。原因:发【英文标题】:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Fa 【发布时间】:2019-10-30 15:09:19 【问题描述】:

我正在使用 Spring Boot、Spring Cloud Config 和 Docker 开发 Web 应用程序。有3个项目。一种是springboot web、Spring Cloud Config Server和mysql Database。我已经将 Spring Boot Web 与 Themeleaf 一起使用。它基本上是执行 CRUD 操作。在开发阶段它工作正常。但是当我在 Docker 中部署它时 Spring-Boot webapp 容器(springboot-thymeleaf-web-crud)给了我以下错误--


应用程序启动失败


说明:

配置数据源失败:未指定“url”属性,无法配置嵌入式数据源。

原因:无法确定合适的驱动程序类

行动:

考虑以下几点: 如果您想要一个嵌入式数据库(H2、HSQL 或 Derby),请将其放在类路径中。 如果您有要从特定配置文件加载的数据库设置,您可能需要激活它(当前没有激活的配置文件)。

我在 Docker Compose 文件上创建了 3 个容器。

version: '3'

services: 
   springboot-thymeleaf-web-crud:
      image: numery/springboot-thymeleaf-web-crud:latest
      networks: 
         - employee-network
      ports:
         - 8080:8080 
      depends_on:
         - employee-database   
         - spring-cloud-config-server-employee

   spring-cloud-config-server-employee:
      image: numery/spring-cloud-config-server-employee:latest
      networks: 
         - employee-network
      ports:
         - 8888:8888

   employee-database:
      image: mysql:5
      networks:
         - employee-network
      environment:
         - MYSQL_ROOT_PASSWORD=rootpassword
         - MYSQL_DATABASE=employee_directory
      volumes:
         - /home/numery/Docker-Database/employee_directory:/var/lib/mysql

networks:
   employee-network:

SpringBoot Web Application.properties 如下所示

spring.application.name=employee-service-mysql
server.port=8080
spring.cloud.config.uri=http://spring-cloud-config-server- 
employee:8888
spring.profiles.active=dev

SpringBoot Config Server 提供以下属性--

spring.datasource.url: jdbc:mysql://employee- 
database:3306/employee_directory? 
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
spring.datasource.username: root
spring.datasource.password: rootpassword
spring.datasource.validationQuery: SELECT 1
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.tomcat.max-wait: 20000
spring.tomcat.max-active: 50
spring.tomcat.max-idle: 20
spring.tomcat.min-idle: 15

spring.jpa.properties.hibernate.dialect: 
org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql: true
spring.jpa.format-sql: true
spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: create

在这 3 个容器中,Mysql 和 Spring Cloud Config 容器工作正常。但是对于 Spring Boot Webapp(springboot-thymeleaf-web-crud) 通过给出上述错误退出。

注意:我在其他一些 SpringBoot Rest API 上使用相同的数据源(Spring Data JPA)配置。哪些工作正常。但这是我第一次使用 SpringBoot Web。我是否需要在数据源上明确定义任何配置。

请帮忙!!

【问题讨论】:

【参考方案1】:

我执行以下任务来解决问题--

1) 我们应该已经启动并运行了 mysql 容器。

2) 检查 ip 运行的 mysql 容器—— docker 检查 mysqlcontainer | grep IP

3) 将该 mysql 容器的 IP 添加到我的 springboot 网络应用——

"spring.datasource.url: jdbc:mysql://172.20.0.2:3306/employee_directory? useSSL=false&serverTimezone =UTC&useLegacyDatetimeCode=false"

4) 运行 mvn clean、mvn install 并构建 SpringBoot Web 图片。

5) 如果我们关闭容器,我们需要执行 再次执行相同的任务。因为每次Mysql 容器获取不同的ip。

【讨论】:

【参考方案2】:

数据源 URL,即spring.datasource.url: jdbc:mysql://employee- 可能是错误的。 或者应该将您的数据源网址添加到您的 Application.properties 文件

网址格式应为jdbc:oracle:thin:@hostname:portNumber/schemaName

欲了解更多详情和说明,Not using the hostname and port in jdbc url

【讨论】:

我还有另一个 SpringBoot Rest Api。在 Docker 中运行。我正在使用以下 spring.datasource.url:jdbc:mysql://customer-database:3306/customerdatabase。为什么这工作正常?我在那个 api 上没有收到任何错误。 @Numery,上面你的代码中的datasource url,spring.datasource.url:jdbc:mysql://employee-你没有指定连接数据库的端口和主机名。这可能是错误的原因 - 无法配置数据源:未指定“url”属性并且无法配置嵌入式数据源。 @Perera,明确提及。 spring.datasource.url: jdbc:mysql://employee-database:3306/employee_directory? useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false @Numery,对不起,我没有看到 database:3306/employee_directory?代码中的 useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false 部分。我的错。 您是否尝试将 url 添加到您的 Application.properties 文件中? 我已将其添加到 appliaction.properties 文件中。但是出现以下错误--------2019-06-17 01:07:45.964 ERROR 24392 --- [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - 池初始化期间出现异常。 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.13.jar:8.0.13]

以上是关于无法配置数据源:未指定“url”属性,并且无法配置嵌入式数据源。原因:发的主要内容,如果未能解决你的问题,请参考以下文章

无法配置数据源:未指定“url”属性,并且无法配置嵌入式数据源。原因:发

无法配置数据源:未指定“url”属性,无法配置嵌入式数据源。- java spring 项目

无法配置数据源:未指定“url”属性,无法配置嵌入式数据源。Gradle 项目中的错误

数据源:未指定“url”属性,无法配置嵌入式数据源

无法确定合适的驱动程序类弹簧

Liquibase ERROR 数据库 URL 未指定为参数或属性文件