【问题标题】:cannot connect to MySQL-server running on Docker with JDBC - Communication Link Failure无法使用 JDBC 连接到在 Docker 上运行的 MySQL 服务器 - 通信链路故障
【发布时间】:2021-11-16 21:49:45
【问题描述】:

我有一个带有 PORTS 3306/tcp, 33060-33061/tcp 的 Mysql-server docker 实例。 我正在尝试通过 JDBC 连接到它,但我不断收到错误 Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure。 我创建了一个用户 test 和一个数据库也命名为 test

我使用的代码如下:

package com.example.testconnection;

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

public class TestConnection {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "test";
        String password = "password";

        System.out.println("Connecting database...");

        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("Database connected!");
        } catch (SQLException e) {
            throw new IllegalStateException("Cannot connect the database!", e);
        }

    }
}

使用 Gradle 构建,具有以下依赖项:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0'
    runtimeOnly 'mysql:mysql-connector-java:8.0.25'
}

我错过了什么?

【问题讨论】:

  • 那么,你是如何运行你的 mySql 容器的?你检查过docker ps吗?
  • 是的,我的docker ps 的端口是我在上面写的。也许我做错了什么,但服务在我的主机上的端口 3306 上运行,也许在容器不同
  • 请提供完整的堆栈跟踪。我相信其中一个“由”提供了更多信息。还为您的 mysql 容器提供“docker ps”转储。

标签: java mysql docker jdbc


【解决方案1】:

通过使用docker inspect nameofmycontainer | grep IPAddress 检查 mysql docker 容器并获取 IP 来解决,例如172.17.0.2。把这个IP地址改成Java代码,替换成localhost,就可以解决问题了!

另一个重要的事情是确保用户有权在localhost 之外进行连接。这可以通过做 GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2021-11-21
    • 2020-04-24
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多