You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署SpringBoot+MySQL时数据库连接创建失败问题

解决SpringBoot + Docker Compose连接MySQL失败的问题

遇到的错误:
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up

下面是具体问题排查和解决方案:

1. 数据库连接地址的配置问题

问题点:

  • docker-compose.yaml里的环境变量格式错误:-SPRING_DATASOURCE_URL: ... 写法不符合Compose环境变量规范,应该用「空格+等号」的形式;同时URL里的&是HTML转义字符,YAML中直接用&即可。
  • application.properties中配置的spring.datasource.url=jdbc:mysql://localhost:3306/spring?serverTimezone=UTC 在Docker容器内无效——容器的localhost指向自身,无法访问Compose网络中的MySQL服务,必须用服务名mysqldb作为连接地址。

修正:

在docker-compose.yaml的project服务中,正确配置环境变量覆盖连接地址:

environment:
  - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/spring?autoReconnect=true&useSSL=false&serverTimezone=UTC

2. MySQL版本与Hibernate方言不兼容

问题点:

你使用的是MySQL 8镜像,但application.properties里配置的是org.hibernate.dialect.MySQL5Dialect,这会导致连接时的方言适配错误。

修正:

把方言改为MySQL 8对应的版本,可通过环境变量覆盖或直接修改application.properties:

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

3. MySQL未就绪时SpringBoot提前启动

问题点:

depends_on仅保证MySQL服务先启动,但不保证MySQL完成初始化、可以接受连接。SpringBoot启动时MySQL还没准备好,就会出现连接失败重试后放弃的错误。

修正:

给MySQL服务添加健康检查,让SpringBoot在MySQL就绪后再启动:
在docker-compose.yaml的mysqldb服务中添加健康检查配置:

healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"]
  interval: 5s
  timeout: 5s
  retries: 5

同时修改project服务的depends_on,依赖MySQL的健康状态:

depends_on:
  mysqldb:
    condition: service_healthy

最终完整配置

docker-compose.yaml

version: "3.8"
services:
  project:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/spring?autoReconnect=true&useSSL=false&serverTimezone=UTC
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=1234
      - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL8Dialect
    depends_on:
      mysqldb:
        condition: service_healthy

  mysqldb:
    image: mysql:8
    ports:
      - 33066:3306
    environment:
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_DATABASE=spring
    volumes:
      - spring:/data/db
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"]
      interval: 5s
      timeout: 5s
      retries: 5
volumes:
  spring:

application.properties(可简化,环境变量会覆盖对应配置)

spring.jpa.database=mysql
server.error.include-message=always
server.error.include-binding-errors=always
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto = create

内容的提问来源于stack exchange,提问作者Morphelia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:45:28