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

Apache Shiro连接本地Docker容器MySQL遇通信链路故障

我来帮你排查这个Shiro连接Docker MySQL的通信问题!你用Sequel Pro和IntelliJ能正常连上数据库,但Shiro却抛出「Communications link failure」,核心问题大概率是容器网络访问逻辑的差异或者Shiro配置细节没到位,下面给你一步步拆解解决方案:

1. 先检查Shiro.ini里的JDBC URL配置细节

你提到其他工具用的是jdbc:mysql://localhost:13306/UNIHUB_DB,但要确保Shiro配置里的URL完全一致,还要注意几个容易踩坑的点:

  • 如果你的应用是运行在Docker容器内,localhost指向的是容器自身,而非宿主机!这时候得把URL改成宿主机的局域网IP(比如192.168.1.100),或者用Docker提供的特殊域名:Windows/macOS用host.docker.internal,Linux用gateway.docker.internal。
  • 务必加上useSSL=false和serverTimezone参数,避免SSL验证和时区不匹配导致的额外连接失败。

给你一个正确的Shiro.ini配置示例:

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
# 配置MySQL数据源
jdbcRealm.dataSource=com.mysql.cj.jdbc.MysqlDataSource
jdbcRealm.dataSource.url=jdbc:mysql://host.docker.internal:13306/UNIHUB_DB?useSSL=false&serverTimezone=UTC
jdbcRealm.dataSource.user=root
jdbcRealm.dataSource.password=admin
# 你的认证查询语句
jdbcRealm.authenticationQuery=SELECT password FROM users WHERE username = ?

2. 确认MySQL容器的端口映射与运行状态

虽然你用工具能连上,但还是要再核对一下:

  • 执行docker ps命令,查看MySQL容器的端口映射是否为0.0.0.0:13306->3306/tcp,确保端口没有被其他进程占用。
  • 确认容器处于Up状态,如果容器意外停止,重启一下即可:docker restart [容器ID/名称]

3. 检查MySQL的绑定地址配置

部分MySQL镜像默认只绑定127.0.0.1,这会导致容器外的应用(包括Shiro)无法访问。你可以通过两种方式修改:

  • 启动容器时直接添加参数:
    docker run -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=UNIHUB_DB mysql:latest --bind-address=0.0.0.0
    
  • 或者挂载自定义的my.cnf配置文件,将bind-address设置为0.0.0.0。

4. 用纯Java代码测试数据库连接(排除Shiro干扰)

先写个简单的Java测试类,绕开Shiro直接用JDBC连接,验证基础连接是否正常:

import java.sql.Connection;
import java.sql.DriverManager;

public class TestDBConnection {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:13306/UNIHUB_DB?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "admin";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            System.out.println("数据库连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如果这个测试类也报错,说明问题不在Shiro,而是Java程序的网络配置或MySQL的访问权限问题;如果能成功,那就是Shiro的配置细节有误(比如数据源属性名写错、驱动依赖缺失)。

5. 确认MySQL驱动依赖是否正确

MySQL 8.0+推荐使用com.mysql.cj.jdbc.MysqlDataSource而非旧版的com.mysql.jdbc.Driver,同时要确保项目依赖里包含MySQL驱动:
Maven项目在pom.xml中添加:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:12:01