使用Docker Compose部署Spring Boot+MySQL遇数据库连接失败求助
问题排查与解决办法
从你的项目目录结构来看,配置文件和构建产物的位置没有问题,你遇到的java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.连接失败问题,主要由以下原因导致,对应解决办法如下:
一、核心问题分析
- MySQL服务未完全就绪就启动Spring应用:
depends_on仅保证mysql-db容器先启动,但MySQL启动后还需要初始化数据库、加载系统表,这个过程需要几秒时间。Spring应用启动时直接尝试连接,此时MySQL还未准备好,就会触发重试后失败。 - MySQL 8.0认证插件不兼容:MySQL 8.0默认使用
caching_sha2_password认证插件,部分旧版本JDBC驱动或配置不当的情况下,会出现连接被拒绝的情况。 - JDBC驱动版本过低:如果项目中使用的MySQL驱动版本过老,可能无法适配MySQL 8.0的新特性。
二、具体解决办法
办法1:让Spring等待MySQL就绪后再启动
可以通过脚本或Spring配置实现等待逻辑:
方式A:使用wait-for-it脚本
下载wait-for-it.sh脚本到项目根目录,修改Dockerfile添加等待逻辑:
FROM openjdk:17 WORKDIR /app COPY wait-for-it.sh /app/ COPY target/smartstock-0.0.1-SNAPSHOT.jar /app/ RUN chmod +x wait-for-it.sh CMD ["./wait-for-it.sh", "mysql-db:3306", "--", "java", "-jar", "smartstock-0.0.1-SNAPSHOT.jar"]
方式B:通过Spring配置添加重试
在application.properties中增加连接超时和重试配置:
# 延长连接超时时间 spring.datasource.hikari.connection-timeout=30000 # 允许初始化失败后持续重试,直到连接成功 spring.datasource.hikari.initialization-fail-timeout=0
办法2:修改MySQL认证插件为兼容版本
在docker-compose.yml的mysql-db服务中添加命令,强制使用旧版认证插件:
version: '3.8' services: mysql-db: image: mysql:8.0 container_name: mysql-container environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: inventory MYSQL_USER: user MYSQL_PASSWORD: password # 强制使用兼容旧驱动的认证插件 command: --default-authentication-plugin=mysql_native_password ports: - "3306:3306" # spring-app服务配置保持不变
办法3:确认JDBC驱动版本适配
检查pom.xml中的MySQL驱动版本,确保为8.0及以上:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
你的application.properties中已经正确配置了spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver,无需修改。
关于application.properties的说明
你的观点没错:docker-compose中配置的SPRING_DATASOURCE_*环境变量会覆盖application.properties中的对应配置,当前两者内容一致,不会产生冲突。若后续出现配置不一致的情况,以环境变量为准。
内容的提问来源于stack exchange,提问作者高造擎
相关产品推荐
相关产品推荐

