![JDBC 通信链接失败。iptable 设置](https://linux22.com/image/522713/JDBC%20%E9%80%9A%E4%BF%A1%E9%93%BE%E6%8E%A5%E5%A4%B1%E8%B4%A5%E3%80%82iptable%20%E8%AE%BE%E7%BD%AE.png)
我有一个在工作机器上运行的 Java 应用程序,但无法连接到生产服务器。
这是连接代码:
String db = "jdbc:mysql://localhost:3306/"+database+
"?zeroDateTimeBehavior=convertToNull";
connect = DriverManager.getConnection(db, username, password);
其中用户名、数据库名称和密码设置正确。运行时,我得到:
com.mysql.jdbc.exceptions.jdbc4.CommunicationException: Communications link failure
我认为这与我的 iptables 设置有关。当我 telnet localhost 3306 时,我的连接被拒绝;但是,当我从端口 3306 上的另一台机器 telnet 服务器时,我可以连接(服务器接受 LAN 上的远程连接)。这是正常现象吗?
我原本以为 localhost 连接默认会起作用,但显然不行。顺便说一下,服务器运行的是 debian。有什么想法可以解决这里的问题以及我该如何修复它吗?
干杯。
编辑:
暂时重置 iptables 设置后,我开始怀疑问题出在哪里,并且可能与 mysql 配置有关。
my.cnf 中的绑定地址设置为服务器 IP - 而不是 127.0.0.1。我可以使用 IP 从本地计算机进行 telnet,但仍然无法使用 JDBC 连接到它。据我所知,mysql 只能有一个绑定地址。也许我需要在 mysql 设置中进行一些调整...
答案1
您的 MySQL 可能配置为仅监听一个 IP 地址。还请注意,localhost
在某些(如果不是大多数)MySQL 客户端中具有特殊含义:它意味着在机器上使用 UNIX 套接字。该地址127.0.0.1
将使用真实的 TCP 连接,因此请尝试一下。
如果您仍然怀疑 iptables:iptables -L
将允许您查看当前规则集。
编辑:如果您的 MySQL 配置为监听特定地址,则您很可能可以通过让其监听来让它监听所有地址0.0.0.0
。
编辑2:或者简单地从配置中删除参数。
答案2
如果它在另一台服务器上运行,那么该服务器就是托管 mysql 数据库的服务器。您的连接字符串需要引用它而不是 localhost。
命令“netstat -lnt | grep 3306”将告诉您 mysql 是否正在运行并监听端口。如果它只监听“127.0.0.1”,则需要在同一台服务器上运行 Java 应用程序,或建立隧道连接。如果它只监听 127.0.0.1 以外的地址,请尝试用该地址替换 localhost。
编辑:据我所知,您的 mysql 配置应该不错。检查端口以查看它是否已移至非标准端口。有两个位置定义了端口,因此请检查两者。要查看它是否正在监听,请运行上面的 netstat 命令。如果它没有监听,您将无法连接。Debian 默认应监听 TCP 地址 localhost:3306。
允许远程连接是典型的做法。要启用它,请在 mysql 配置中将监听地址更改为 0.0.0.0,然后重新启动。
我用数据库可视化工具浏览数据库。这是一个使用 JDBC 访问数据库的 Java 应用程序。它在连接失败时提供相当不错的输出,因此您可能想尝试一下。首先使用不带选项的基本连接字符串。然后添加日期选项以查看是否是问题所在。
MySQL 登录安全性除了用户和密码外,还可能包括原始主机,因此登录可能会因此失败。密码可能因来源而异。
答案3
大多数Linux发行版在默认安装MySQL的时候默认MySQL不使用网络连接,而是通过socket连接。
通常有一个名为 /etc/my.cnf 的文件。在其中找到包含以下内容的行并将其注释掉:skip-networking
一旦将其注释掉,重新启动 MySQL,您就应该能够顺利连接。