更改 UFW 设置后在 Docker 中连接到 MySQL 时出现 java.sql.SQLException

问题描述

以下是我在 Docker 容器内运行的代码的一部分。我之前已经创建了变量。

String MysqLUrl = "jdbc:MysqL://" + MysqLHost + "/" + MysqLDatabase + "?user=" + MysqLUser + "&password=" + MysqLPass;
try {
    MysqLConnection = DriverManager.getConnection(MysqLUrl);
} catch (sqlException e) {
    e.printstacktrace();
}

错误如下:

java.sql.sqlException: Access denied for user 'myusername'@'_gateway' (using password: YES)

让我解释一下我做了什么:

我的代码运行良好。但是,在我对 UFW 设置进行了一些更改后,告诉 UFW 管理对所有 Docker 容器的传入请求,该错误发生了。我按照这个答案修改了 UFW 设置:https://stackoverflow.com/a/51741599/14772173

我已经尝试过的事情:

我已经打开了UFW 3306端口,可以确认我的MysqL用户名密码正确,我的数据库接受所有IP地址的远程连接。

bind-address = 0.0.0.0

MariaDB [(none)]> SELECT User,Host FROM MysqL.user WHERE Host <> '';
+-----------------+-----------+
| User            | Host      |
+-----------------+-----------+
| myusername      | %         |
| root            | localhost |
+-----------------+-----------+
2 rows in set (0.001 sec)

我可以确认我的 Docker 容器可以访问外部 Internet,因为它可以向 google.com 发送请求,并且可以响应来自 ping 工具和状态监视器的请求。

请帮助解释为什么我的代码无法连接到 Docker 之外的 MysqL 数据库,以及我该如何解决这个问题。非常感谢。

解决方法

指定如下端口号后,我的代码就可以工作了。我认为端口号是可选的。

String mysqlUrl = "jdbc:mysql://" + mysqlHost + ":3306/" + mysqlDatabase + "?user=" + mysqlUser + "&password=" + mysqlPass;
try {
    mysqlConnection = DriverManager.getConnection(mysqlUrl);
} catch (SQLException e) {
    e.printStackTrace();
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...