使用JDBC和MySQL解决“通信链接失败”问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

使用JDBC和MySQL解决“通信链接失败”问题

保持可爱mmm 2020-05-08 10:55:13 54

我正在尝试连接到本地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. (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. (ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection. (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. (Socket.java:375) at java.net.Socket. (Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO. (MysqlIO.java:294) ... 15 more 我已经设置了类路径,确保my.cnf的“跳过网络”选项已被注释掉。

Java版本是1.2.0_26(64位)mysql 5.5.14 mysql连接器5.1.17

我确保用户可以访问我的数据库。

关系型数据库 MySQL Java 数据库连接 数据库
分享到
取消 提交回答
全部回答(1)
  • 保持可爱mmm
    2020-05-08 10:55:29

    我的两个程序都遇到了相同的问题。我的错误是这样的:

    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,而不是Program Files)

    以下是解决方案: 更改“绑定地址”属性 取消注释“绑定地址”属性或将其更改为以下IP之一:

    bind-address =“ 127.0.0.1”

    要么

    绑定地址=“ 0.0.0.0”

    注释掉“跳过网络” 如果您的MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”符号使其成为注释。

    更改“ wait_timeout”和“ interactive_timeout” 将这些行添加到MySQL配置文件中:

    wait_timeout = 数字

    Interactive_timeout = 数字

    connect_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(例如JDK 6和7) 不要更改max_allowed_pa​​cket “ max_allowed_pa​​cket ”是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。

    更改tomcat的安全性 将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否

    使用validationQuery属性 使用validationQuery =“ select now()”确保每个查询都有响应

    自动重新连接 将此代码添加到您的连接字符串中:

    &autoReconnect=true&failOverReadOnly=false&maxReconnects=10 尽管这些解决方案都不适合我,但我建议您尝试一下。因为有些人按照以下步骤解决了他们的问题。

    但是什么解决了我的问题?

    我的问题是我在数据库上有很多SELECT。每次创建连接然后关闭它时。尽管我每次都关闭连接,但是系统面临许多连接,并给了我这个错误。我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行了初始化。然后,每次我使用该连接时。它解决了我的问题,也大大提高了我的速度。

    结论 没有简单独特的方法可以解决此问题。我建议您考虑自己的情况并选择上述解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果在与数据库进行多次成功交互之后出现此错误,则问题可能出在连接数上,您可能会考虑更改“ wait_timeout”和其他MySQL设置,或者重写您的代码以减少连接数。来源:stack overflow

    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题
推荐课程