java—用jdbc和mysql解决“通信链路故障”

ghhaqwfi  于 2021-06-29  发布在  Java
关注(0)|答案(13)|浏览(358)

这个问题在这里已经有答案了

com.mysql.jdbc.exceptions.jdbc4.communicationsexception:通信链路故障(39个答案)
四年前关门了。
我正在尝试连接到本地mysql服务器,但我不断得到一个错误。
这是密码。

public class Connect {

    public static void main(String[] args) {
        Connection conn = null;

        try {
            String userName = "myUsername";
            String password = "myPassword";

            String url = "jdbc:mysql://localhost:3306/myDatabaseName";
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            System.out.println("Database connection established");
        } catch (Exception e) {
            System.err.println("Cannot connect to database server");
            System.err.println(e.getMessage());
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("Database Connection Terminated");
                } catch (Exception e) {}
            }
        }
    }
}

以及错误:

Cannot connect to database server
Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at Connect.main(Connect.java:16)
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:218)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
        ... 15 more

我已经设置了类路径,确保my.cnf的skip network选项被注解掉了。
java版本是1.2.0č26(64位)mysql 5.5.14 mysql connector 5.1.17
我确保用户可以访问我的数据库。

0wi1tuuw

0wi1tuuw1#

对我来说,解决方案是在mysql服务器的conf文件中,将参数bind address=“127.0.0.1”或bind address=“x.x.x.x”更改为bind address=“0.0.0.0”。谢谢。

baubqpgj

baubqpgj2#

我知道这是一个老线程,但我已经尝试了很多事情,并修复了我的问题,使用以下方法。。
我正在windows上开发一个跨平台的应用程序,但是要在linux和windows服务器上使用。
两个系统上都安装了名为“jtm”的mysql数据库。出于某种原因,在我的代码中,数据库名为“jtm”。在windows上,它运行得很好,事实上,在几个windows系统上,它运行得很好。
在ubuntu上,我一次又一次地遇到上面的错误。我在代码“jtm”中用正确的大小写进行了测试,结果很不错。
linux显然对区分大小写不那么宽容(这是正确的),而windows则允许。
我现在觉得有点傻,但检查一下一切。错误信息并不是最好的,但如果你坚持下去,把事情做好,它似乎是可以修复的。

tpgth1q7

tpgth1q73#

设置 bind-address 到服务器的网络ip,而不是本地主机的默认值,并且对我的用户设置权限对我很有用。
我的.cnf:

bind-address = 192.168.123.456

mysql控制台:

GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';
zphenhs4

zphenhs44#

如果你使用的是mamp-pro,这是一个简单的解决方案,我真的希望在我开始上网搜索数天来试图找出这个问题之前就意识到了这一点。其实很简单。。。
您只需单击mamp mysql选项卡中的“允许网络访问mysql”。
真的,就这样。
哦,您可能仍然需要将绑定地址更改为0.0.0.0或127.0.0.1,如上面文章中所述,但是如果您是mamp用户,仅单击该框可能会解决您的问题。

hfsqlsce

hfsqlsce5#

正如上面详细的回答所说的,这个错误可能是由很多事情引起的。
我也有这个问题。我的安装是MacOSX10.8,使用的是Ubuntu12.04的虚拟机,MySQL5.5.34。
我在vagrant配置文件中正确设置了端口转发。我可以从mac和vm内部telnet到mysql示例。所以我知道mysql守护进程正在运行并且可以访问。但是当我试图通过jdbc连接时,出现了“通信链路故障”错误。
在我的例子中,通过编辑/etc/mysql/my.cnf文件解决了这个问题。具体来说,我注解掉了“#bind address=127.0.0.1”行。

hjzp0vay

hjzp0vay6#

在我的例子中,是一个空闲超时,导致服务器上的连接中断。连接保持打开,但长时间未使用。然后客户端重启工作,而我相信重新连接也会工作。
一个不错的解决方案是使用守护程序/服务不时ping连接。

bqujaahr

bqujaahr7#

如果您对一组docker容器有问题,那么请确保您不仅 EXPOSE 港口 3306 ,但也可以从容器外部Map端口 -p 3306:3306 . 为了 docker-compose.yml :

version: '2'

services:
    mdb:
        image: mariadb:10.1
        ports:
            - "3306:3306"
        …
laik7k3q

laik7k3q8#

我在两个项目中也遇到过同样的问题。我的错误是:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

我花了几天时间来解决这个问题。我已经测试了许多在不同网站上提到的方法,但没有一种有效。最后我修改了代码,找出了问题所在。我会尽量告诉你不同的方法,并在这里总结。
当我在互联网上寻找这个错误的解决方案时,我发现有很多解决方案至少对一个人有效,但其他人说对他们无效!为什么有很多方法可以解决这个错误?当连接到服务器出现问题时,似乎通常会发生此错误。问题可能是因为错误的查询字符串或到数据库的连接太多。
所以我建议你一个接一个地尝试所有的解决方案,不要放弃!
以下是我在互联网上找到的解决方案,对于每一个,至少有一个人的问题已经用这个解决方案解决了。
提示:对于需要更改mysql设置的解决方案,可以参考以下文件:
linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于使用的linux发行版和mysql包)
windows:c:programdata\mysql\mysql server 5.6\my.ini(注意它是programdata,不是程序文件)

以下是解决方案:

更改“绑定地址”属性
取消对“bind address”属性的注解或将其更改为以下IP之一:
绑定地址=“127.0.0.1”

绑定地址=“0.0.0.0”
评论“跳过网络”
如果您的mysql配置文件中有一行“skip networking”,请在该行的开头添加“#”符号以对其进行注解。
更改“等待超时”和“交互式超时”
将以下行添加到mysql配置文件:
wait\u timeout=数字
交互式\u超时=数字
connect\u timeout=数字
确保java没有将“localhost”转换为[:::1],而不是[127.0.0.1]
因为mysql可以识别127.0.0.1(ipv4)但不能:::1(ipv6)
这可以通过使用以下两种方法之一来避免:
选项#1:在连接字符串中使用127.0.0.1而不是localhost,以避免localhost被转换为:::1
选项2:使用-djava.net.preferipv4stack=true选项运行java,强制java使用ipv4而不是ipv6。在linux上,也可以通过运行(或将其放入/etc/profile:

export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"

检查操作系统代理设置、防火墙和防病毒程序
确保防火墙或防病毒软件没有阻止mysql服务。
在linux上暂时停止iptables。如果iptables配置错误,它们可能会允许将tcp包发送到mysql端口,但会阻止tcp包返回同一连接。


# Redhat enterprise and CentOS

systemctl stop iptables.service

# Other linux distros

service iptables stop

停止windows上的防病毒软件。
更改连接字符串
检查查询字符串。你的连接字符串应该是这样的:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

确保字符串中没有空格。所有连接字符串应连续,不带任何空格字符。
尝试用环回地址127.0.0.1替换“localhost”。还可以尝试向连接字符串中添加端口号,例如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

mysql的默认端口通常是3306。
不要忘记将用户名和密码更改为mysql服务器的用户名和密码。
更新jdk驱动程序库文件
测试不同的jdk和jre(比如jdk6和jre7)
不更改允许的最大\u数据包
“max\u allowed\u packet”是mysql配置文件中的一个变量,它表示最大数据包大小,而不是最大数据包数。所以解决这个错误是没有帮助的。
更改tomcat安全性
将tomcat6\u security=yes更改为tomcat6\u security=no
使用validationquery属性
使用validationquery=“select now()”确保每个查询都有响应
自动重新连接
将此代码添加到连接字符串:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

虽然这些方法对我都不管用,但我建议你试试。因为有些人通过遵循这些步骤解决了他们的问题。
但什么解决了我的问题?
我的问题是我在数据库上有很多选择。每次我创建一个连接,然后关闭它。虽然我每次都在关闭连接,但是系统面临许多连接,并给了我那个错误。我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中初始化它。然后每次我用那个连接。它解决了我的问题,也大大提高了我的速度。

结论

解决这个问题没有简单而独特的方法。我建议你考虑一下自己的情况,选择上面的解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果您在与数据库的多次成功交互后出现此错误,那么问题可能是连接的数量,您可以考虑更改“wait\u timeout”和其他mysql设置,或者重写代码以减少连接的数量。

des4xlb0

des4xlb010#

就我而言,
在上更改远程计算机mysql配置 /etc/mysql/my.cnf :更改 bind-address = 127.0.0.1#bind-address = 127.0.0.1 在远程计算机上,使用 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password'; 重要提示:在远程计算机上重新启动mysql: sudo /etc/init.d/mysql restart

v440hwme

v440hwme11#

在我的例子中,当mysql没有足够的内存时就会发生这种情况。重新启动可以修复它,但是如果是这样的话,可以考虑使用内存更多的nachine,或者限制jvm占用的内存

gtlvzcf8

gtlvzcf812#

在我的例子中(我是一个noob),我测试了一个与mysql建立数据库连接的servlet,其中一个例外就是上面提到的那个。
它让我的头摇摆了几秒钟,但我逐渐意识到,这是因为我还没有启动我的mysql服务器 localhost .
启动服务器后,问题得到修复。
所以,检查mysql服务器是否正常运行。

fnvucqvd

fnvucqvd13#

我也面临同样的问题。之所以发生这种情况,是因为mysql守护程序绑定到了机器的ip上,这是与有权连接@your\u机器的用户建立连接所必需的。在这种情况下,用户应该有连接的权限user_name@machine_name_or_ip
我想远程访问我的机器,所以我在我的.cnf中从

bind-address = MY_IP_ADDRESS

bind-address = 0.0.0.0

这将允许localhost甚至外部(在我的例子中)的用户连接到示例。如果您将mysql绑定到0.0.0.0,以下两个权限都将起作用:

USER_NAME@MACHINE_NAME_OR_IP

USER_NAME@localhost

相关问题