本地正常,Docker 中报错:SQLNonTransientConnectionException: Could not create connection to database se
2024-01-11 19:02:15
在 Docker 中解决 MySQL 数据库连接错误:SQLNonTransientConnectionException
问题陈述:
在使用 Docker Compose 在 Docker 容器中启动 MySQL 数据库时,Java 代码尝试连接到该数据库时遇到了 "SQLNonTransientConnectionException: Could not create connection to database se" 错误。
原因分析:
导致此错误的原因可能有多种,包括:
- SSL 连接问题: Docker 中的 MySQL 服务器默认以非 SSL 模式运行,而 Java 代码指定了
useSSL=false
,导致连接失败。 - 数据库配置错误: MySQL 配置文件未启用 SSL,或者 SSL 证书和私钥配置不正确。
- 防火墙或安全组限制: Docker 容器和主机系统上的防火墙或安全组设置阻止了 MySQL 端口 (默认端口为 3306) 的通信。
解决方案:
要解决此错误,请按照以下步骤进行操作:
- 启用 SSL 连接:
-
编辑 MySQL 配置文件 (
my.cnf
),在[mysqld]
部分添加以下配置:ssl-mode=REQUIRED ssl-ca=/path/to/ca.pem ssl-cert=/path/to/server.crt ssl-key=/path/to/server.key
-
重启 MySQL 服务器。
-
- 配置 Java 代码:
-
在 Java 代码中,将
useSSL
参数设置为true
:String jdbcUrl = "jdbc:mysql://localhost:3306/se?useSSL=true";
-
确保已将 MySQL JDBC 驱动添加到项目的依赖项中。
-
- 检查防火墙和安全组设置:
- 确保 Docker 容器和主机系统上的防火墙或安全组允许 MySQL 端口 (默认端口为 3306) 的通信。
扩展:
SSL 连接简介
SSL(安全套接字层)是一种用于在网络上建立加密连接的协议。它可以防止数据在传输过程中被窃听或篡改。
在 MySQL 中启用 SSL
在 MySQL 中启用 SSL 的步骤包括:
- 生成 SSL 证书和私钥
- 配置 MySQL 服务器
- 重启 MySQL 服务器
- 测试 SSL 连接
有关详细说明,请参阅 MySQL 文档。
Java 代码中的 SSL 连接设置
在 Java 代码中,可以通过将 useSSL
参数设置为 true
来启用 SSL 连接。还可以在 JDBC 连接字符串中设置 sslMode
参数以指定 SSL 模式。
常见问题解答
1. 为什么需要启用 SSL 连接?
SSL 连接可以提高数据传输的安全性,防止数据被窃听或篡改。
2. verifyServerCertificate=true 是否必需?
设置 verifyServerCertificate=true
可以提高连接安全性,但如果服务器端使用的 SSL 证书不是由受信任的证书颁发机构签发的,则可能会导致连接失败。
3. 在哪里可以找到 MySQL JDBC 驱动?
MySQL JDBC 驱动可以从 Maven Central 或 MySQL 网站下载。
4. 如何检查防火墙和安全组设置?
在 Windows 中,可以使用 Windows 防火墙控制面板检查防火墙设置。在 Linux 中,可以使用 iptables
命令检查安全组设置。
5. 启用 SSL 后,为什么我仍然遇到连接问题?
确保 SSL 证书和私钥配置正确,并且防火墙或安全组允许 MySQL 端口的通信。如果问题仍然存在,请检查 MySQL 日志以获取更多信息。