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

Docker Compose环境下Spring Boot无法连接MySQL数据库问题

解决Spring Boot容器无法连接MySQL的问题

核心问题分析

从日志可见,Web服务启动后立刻尝试连接MySQL,但此时MySQL仍在初始化数据库文件,并未完全就绪;同时Hibernate配置与MySQL 8的兼容性也存在问题,这两个因素共同导致了连接失败。

解决方案

1. 确保MySQL服务就绪后再启动Web服务

depends_on仅保证容器启动顺序,不确保MySQL服务可用。需给MySQL添加健康检查,让Web服务等待MySQL就绪后再启动:

修改docker-compose.yml中mysql服务配置:

mysql:
  container_name: configs_mysql
  image: mysql:latest
  restart: always
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: scrap
    MYSQL_USER: scrap
    MYSQL_PASSWORD: scrap
    MYSQL_DATABASE: configs
  networks:
    - my_network
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
    interval: 5s
    timeout: 5s
    retries: 5

修改web服务的depends_on配置,依赖MySQL的健康状态:

web:
  build: .
  image: scrapyconfigmanager_web
  ports:
    - "8181:8181"
  networks:
    - my_network
  depends_on:
    mysql:
      condition: service_healthy

2. 修正Hibernate配置适配MySQL 8

Hibernate 6与MySQL 8需要匹配正确的方言,且JDBC URL需补充必要参数:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <!-- 添加时区、SSL等参数,解决MySQL 8连接限制 -->
        <property name="hibernate.connection.url">jdbc:mysql://configs_mysql:3306/configs?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true</property>
        <property name="hibernate.connection.username">scrap</property>
        <property name="hibernate.connection.password">scrap</property>
        <property name="hibernate.show_sql">true</property>
        <!-- 使用MySQL 8对应的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <mapping class="org.scrapeusz.model.OlxCar" />
    </session-factory>
</hibernate-configuration>

3. 验证MySQL用户连接权限

确保scrap用户可从容器所在网络连接(默认创建的用户可能仅限localhost):

  1. 进入MySQL容器:
docker exec -it configs_mysql mysql -u root -pscrap
  1. 执行授权SQL:
GRANT ALL PRIVILEGES ON configs.* TO 'scrap'@'%';
FLUSH PRIVILEGES;

注:生产环境建议限制IP范围,此处为测试放宽权限

4. 可选:添加启动等待脚本

若健康检查不生效,可在Web服务的Dockerfile中添加等待脚本,确保MySQL就绪后再启动应用:

FROM openjdk:11
# 安装等待脚本
RUN apt-get update && apt-get install -y wget
RUN wget -O /wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh
RUN chmod +x /wait-for-it.sh

WORKDIR /source_code
COPY . .
RUN ./gradlew bootJar

WORKDIR /scrapy
RUN cp /source_code/build/libs/ScrapyConfigManager-1.0.jar .

EXPOSE 8181
# 等待MySQL端口就绪后启动应用
ENTRYPOINT ["/wait-for-it.sh", "configs_mysql:3306", "--", "java", "-jar", "ScrapyConfigManager-1.0.jar"]

验证步骤

  1. 停止并清理现有容器:docker-compose down
  2. 重新构建并启动服务:docker-compose up --build
  3. 查看日志,确认Web服务在MySQL健康检查通过后启动,且数据库连接成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:24:14