返回

本地正常,Docker 中报错:SQLNonTransientConnectionException: Could not create connection to database se

后端

在 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) 的通信。

解决方案:

要解决此错误,请按照以下步骤进行操作:

  1. 启用 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 服务器。

  2. 配置 Java 代码:
    • 在 Java 代码中,将 useSSL 参数设置为 true

      String jdbcUrl = "jdbc:mysql://localhost:3306/se?useSSL=true";
      
    • 确保已将 MySQL JDBC 驱动添加到项目的依赖项中。

  3. 检查防火墙和安全组设置:
    • 确保 Docker 容器和主机系统上的防火墙或安全组允许 MySQL 端口 (默认端口为 3306) 的通信。

扩展:

SSL 连接简介

SSL(安全套接字层)是一种用于在网络上建立加密连接的协议。它可以防止数据在传输过程中被窃听或篡改。

在 MySQL 中启用 SSL

在 MySQL 中启用 SSL 的步骤包括:

  1. 生成 SSL 证书和私钥
  2. 配置 MySQL 服务器
  3. 重启 MySQL 服务器
  4. 测试 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 日志以获取更多信息。