我有一个在我的工作机器上运行的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本地3306,我的连接被拒绝; 但是,当我通过端口3306从另一台计算机telnet服务器时,我可以连接(服务器接受LAN上的远程连接)。 这是正常的行为?
我会认为本地主机连接默认会工作,但显然不是。 服务器正在运行debian btw。 任何想法这里怎么回事,我怎么能解决它?
干杯。
编辑:
在暂时重置iptables安装程序后,我开始怀疑问题出在哪里,可能是用mysqlconfiguration。
my.cnf中的绑定地址被设置为服务器IP,而不是127.0.0.1。 我可以使用IP从本地机器telnet,但是仍然不能用JDBC连接到它。 从我可以告诉mysql只能有一个绑定地址。 也许这是我需要调整在MySQL设置…
你的MySQL可能被configuration为专门侦听一个IP地址。 另外请注意, localhost在一些(如果不是大多数)MySQL客户端中有特殊的意义:它意味着在盒子上使用UNIX套接字。 地址127.0.0.1将使用一个真正的TCP连接,所以试试。
如果您仍然怀疑iptables: iptables -L将允许您查看当前的规则集。
编辑:如果您的MySQL被configuration为侦听特定的地址,您可以通过使其听取0.0.0.0来最有效地侦听所有地址。
编辑2:或只是从configuration中删除参数。
如果它在另一台服务器上工作,那么该服务器就是托pipemysql数据库的服务器。 您的连接string需要引用它而不是本地主机。
命令“netstat -lnt | grep 3306'会告诉你,如果mysql正在运行和侦听端口。 如果只在“127.0.0.1”上进行监听,则需要在同一台服务器上运行Java应用程序,或者通过连接进行传输。 如果只监听127.0.0.1以外的地址,则尝试用该地址代替localhost。
编辑:从我看到你的MySQLconfiguration应该是好的。 检查端口,看它是否已被移到非标准端口。 有两个定位端口的位置,所以select两者。 要查看是否正在侦听,请运行上面的netstat命令。 如果没有听,你将无法连接。 Debian在默认情况下应该监听TCP地址localhost:3306。
通常允许远程连接。 要启用它,请在您的mysqlconfiguration中将监听地址更改为0.0.0.0,然后重新启动。
我使用DBVisualizer来浏览数据库。 这是一个使用JDBC访问数据库的Java应用程序。 它提供了相当好的连接失败输出,所以你可能想尝试。 首先使用不带选项的基本连接string。 然后添加你的date选项,看看是否是这个问题。
除了用户名和密码之外,MySQLlogin安全性还可以包括原始主机,因此login可能会失败。 密码可以根据来源而有所不同。
大多数Linux发行版默认安装MySQL时默认MySQL不使用networking连接,而是使用套接字。
通常有一个文件调用/etc/my.cnf。 在那里寻找一条有以下内容的线,并将其注释掉:skip-networking
一旦你注释掉了,重新启动MySQL,你应该可以连接没有问题。