【问题标题】:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failurecom.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
【发布时间】:2011-02-28 07:42:53
【问题描述】:

我正在努力让我的数据库与我的 Java 程序对话。

谁能给我一个使用 JDBC 的快速而肮脏的示例程序?

我遇到了一个相当惊人的错误:

Exception in thread "main" 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:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    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:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
Caused by: 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:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    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:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
    ... 13 more

测试文件内容:

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}

【问题讨论】:

  • 我是个笨蛋。 MySQL服务器未启动:(启动成功。
  • 我将 Springboot 数据源从 url:jdbc:mysql://XXX208465:localhost:3306/orv21_kafka_schema 更改为 url:jdbc:mysql://localhost:3306/orv21_kafka_schema。所以不需要 XXX208465,这是我笔记本电脑的主机名。我在本地安装了 mysql 并通过 mySQL CLI 使用它

标签: java mysql jdbc


【解决方案1】:

Mysql 下载 MySQL-JDBC-Type-4-Treiber(ig 'mysql-connector-java-5.1.11-bin.jar' from 'mysql-connector-java-5.1.11.zip')。

您需要在编译和运行时在类路径中包含驱动程序 jar。

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );

【讨论】:

  • 不,给了我一大堆关于找不到任何东西的错误。是否可以在没有 JAR 文件的情况下导入它?
  • @Josh 这行得通,你真的只需要正确设置你的类路径。 (或将 jar 复制到您的 %JAVA_HOME%\jre\lib\ext 目录中,但这被认为是不好的做法)
【解决方案2】:

我可能在这里找错了树,但您的异常似乎表明您的 MySQL 服务器不可用。

线程“主”com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 中的异常: 通信链路故障最后一个成功发送到服务器的数据包为 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。在...

如果你尝试(从终端)会发生什么

mysql -u username -p

系统将提示您输入与用户名关联的密码。输入正确密码后,mysql客户端是否连接?

如果没有,您可能必须从首选项中启动 MySQL。您也可以将其设置为在启动时运行。

【讨论】:

  • 我正在使用 MAMP 运行我的 MySQL 服务器。这会是个问题吗?
  • 当我(通过 Sequal Pro)连接到我的localhost 时,我使用了正确的用户名/密码,并且工作正常。
【解决方案3】:

所以,你有一个

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
java.net.ConnectException:连接被拒绝

我引用 this answer 的内容,其中还包含 MySQL+JDBC 分步教程:

如果您收到SQLException: Connection refusedConnection timed out 或特定于MySQL 的CommunicationsException: Communications link failure,则意味着根本无法访问数据库。这可能有以下一种或多种原因:

  1. JDBC URL 中的 IP 地址或主机名错误。
  2. 本地 DNS 服务器无法识别 JDBC URL 中的主机名。
  3. JDBC URL 中的端口号缺失或错误。
  4. 数据库服务器已关闭。
  5. 数据库服务器不接受 TCP/IP 连接。
  6. 数据库服务器已用完连接。
  7. Java 和 DB 之间的某些东西阻塞了连接,例如防火墙或代理。

要解决其中一个问题,请遵循以下建议:

  1. 使用ping 验证和测试它们。
  2. 刷新 DNS 或改用 JDBC URL 中的 IP 地址。
  3. 根据 MySQL DB 的my.cnf 进行验证。
  4. 启动数据库。
  5. 验证mysqld是否在没有--skip-networking option的情况下启动。
  6. 重新启动数据库并相应地修复您的代码以关闭finally 中的连接。
  7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

另见:

【讨论】:

  • MAMP/ MAMP Pro 默认设置 MAMP_skip-networking_MAMP。您必须在 my.cfn 中禁用此行
  • 不是这种情况,但是当您使用连接池并且连接由于长时间不活动而关闭时,也会发生通信链接故障。只有在这种情况下,它才会显示“最后一个数据包是在“X”秒前收到的”
  • @nikel 不应该通过触发“select 1”验证查询来保持连接池中的线程处于活动状态吗?当我们将 evictor 设置为以比 mysql 服务器超时更短的时间间隔运行时,为什么它们会因长时间不活动而关闭?
  • 是的,验证查询可以解决这个问题。我的观点是关于未设置且池中的连接由于不活动而超时的情况
  • 有时连接字符串中缺少端口,驱动程序将尝试连接到默认的 3306 mysql 端口,如果 mysql 未在此端口上运行,则会失败。这是我的问题,所以我应该提一下,以防其他人发现它有用。
【解决方案4】:

我得到了同样的错误,因为我试图在没有启动 mysql 服务器的情况下运行我的程序。

启动mysql服务器后,一切正常。

【讨论】:

    【解决方案5】:

    刚刚经历过。

    必须通过以下方式使其工作: (这个可以放在静态块初始化器中)

    static{ // would have to be surrounded by try catch
        Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
    }
    

    也可以通过以下方式获取连接:

    conn = DriverManager.getConnection(DBURL,<username>,<password>);
    

    而不是指定登录参数

      Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
    

    问候。

    【讨论】:

    • 自 2007 年以来不再需要静态块,您可以指定任何一种方式的登录参数。
    【解决方案6】:

    当 Java 堆外时,我捕获了这个异常。如果我尝试将许多数据项放入 RAM - 首先我会捕获“Communications link failure”,然后是“OutOfMemoryError”。

    我记录了它并减少了内存消耗(删除 1/2 数据),一切正常。

    【讨论】:

      【解决方案7】:

      就我而言,我需要将 Localhost 替换为实际的数据库服务器 IP 地址

      代替

       Connection con = DriverManager.getConnection(
       "jdbc:mysql://localhost:3306/DBname", "root", "root");
      

      我需要

       Connection con = DriverManager.getConnection(
       "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");
      

      【讨论】:

      • 在 2018 年 4 月 5 日的最新更新中:目前,我使用的是 MySQL Workbench 6.3。我来这里是为了检查解决方案,但我自己找到了,只是你的 MySQL 服务器没有运行或它已停止。我重新启动了我的服务器,它就像一个魅力。
      • 这是“最佳解决方案”,为什么?它解决了什么问题,如何解决?
      • 此解决方案无法生成数据帧
      【解决方案8】:

      我遇到了同样的问题,解决方法如下:

      1. 我的 .jsp 正在调用我尚未在 servlet。
      2. 我有两个列名,我通过 ResultSet (getString("columnName")) 传递给一个对象,这与我的数据库中的列名不匹配。

      我不确定是哪一个解决了这个问题,但它确实有效。此外,请务必为每个表查询创建一个新的 StatementResultSet

      【讨论】:

      • (1)当然不会引起这个问题。
      【解决方案9】:

      请在 /etc/mysql/my.cnf 文件中更新您的 IP 地址

      bind-address  = 0.0.0.0
      

      重启mysql守护进程和mysql服务。

      【讨论】:

      • 编辑使用有效的绑定地址
      【解决方案10】:

      我的同样问题通过以下步骤解决:

      1. 转到my.cnf

        vi /etc/mysql/my.cnf
        
      2. 修改其绑定地址

        "bind-address = 0.0.0.0"
        
      3. 重启 MySQL

        sudo /etc/init.d/mysql restart
        

      【讨论】:

        【解决方案11】:

        这可能是一个简单的 jar 问题。可能您使用的是旧的mysql-connector-java-XXX-bin.jar,您当前的 mysql 版本不支持它。我使用mysql-connector-java-5.1.18-bin.jar 就像我使用mysql 5.5 一样,这个问题已经为我解决了。

        【讨论】:

        • 是的,可能存在 jar 不匹配的可能性。
        • 所有这些驱动版本都应该是兼容的。
        【解决方案12】:

        如果您使用WAMPXAMP 服务器安装mysql 数据库。 然后你必须明确启动mysql服务器,否则它会显示 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 连接数据库时

        【讨论】:

          【解决方案13】:

          如果您更改了端口,则会收到此类错误“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure” 请检查您的端口号

          【讨论】:

            【解决方案14】:

            如果您的数据库连接长时间空闲,则会出现此com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 异常。

            这个空闲连接在connection.isClosed(); 上返回true,但是如果我们尝试执行语句,那么它会触发这个异常,所以我建议使用数据库池。

            【讨论】:

            • 也会出现其他原因,如“连接被拒绝”。
            【解决方案15】:

            我以一种简单的方式解决了这个问题,这对我有用。我遇到了问题“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接故障”。在我的 db.properties 文件中,我有这个:url:jdbc:mysql://localhost:90/myDB, 只删除了端口 url ,导致这种方式 url:jdbc:mysql://localhost/myDB 对我有用。

            【讨论】:

              【解决方案16】:

              几个小时以来我一直遇到同样的问题。我正在使用 MAMP 服务器

              不要使用 localhost:[Apache Port],而是使用您的 MySQL 端口。

              以下是 MAMP 服务器的默认 MySQL 端口。

              String url = "jdbc:mysql://localhost:8889/db_name";
              
              Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
              

              【讨论】:

              • 如果你在安装Mysql之前有mamp,那么试试这个方法
              【解决方案17】:

              当我在 my.ini 和 php.ini 文件中将 mysql 端口从 3306 更改为 3307 时,这发生在我身上,但在将端口 (3307->3306) 更改回来后,它又可以正常工作了。

              【讨论】:

                【解决方案18】:

                在我的情况下,原来是mysql-connector-java的版本太旧了。

                在我的演示中,我以某种方式使用 mysql-connector-java,如下所示:

                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.9</version>
                </dependency>
                

                但是在开发环境中,我用的是这个:

                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.31</version>
                </dependency>
                

                我的 MySQL 版本是 5.1.48(是的,它很旧,只是为了模仿产品版本)。所以我遇到了同样的错误。

                既然找到了原因,也就找到了解决办法。匹配版本!

                【讨论】:

                • 不太可能。所有这些驱动程序版本都应该向后兼容。
                • 这个问题似乎在新的 mysql 连接器中得到修复,见stackoverflow.com/questions/14559794/…
                • 对我来说同样的情况。驱动版本是MySQL 5,而服务器版本是8。所以我更新了jar的版本,问题解决了。
                【解决方案19】:

                较早的答案是合适的。但是,我还想指出一个更普遍的问题。

                我遇到了类似的问题,原因是我公司的网络限制。

                当我在任何其他网络中时,相同的连接正在成功。

                【讨论】:

                • 这个指针解决了我的问题,当我连接到 VPN 时,指定 'localhost' 工作正常,但如果我从 VPN 断开连接,同样不能工作,但是我通过将 'localhost' 更改为 '127.0. 0.1'
                【解决方案20】:

                如果有读者在访问远程服务器时遇到这个问题:请确保端口是开放的

                【讨论】:

                  【解决方案21】:

                  尝试将localhost 更改为127.0.0.1

                  本地主机将被解析为::1。并且 MySQL 默认无法通过 IPv6 连接。

                  这是telnet localhost 3306的输出:

                  $ telnet localhost 3306
                  Trying ::1...
                  

                  并且没有来自 MySQL 服务器的响应。

                  当然,请确保您的 MySQL 服务器正在运行。

                  【讨论】:

                  • 这实际上是你的 /etc/hosts 文件的问题,而不是 Mysql
                  • @cricket_007 默认情况下,localhost 解析为 ::1 而不是 127.0.0.1。
                  • 当然,只有启用了 ipv6 并且取决于主机文件
                  【解决方案22】:

                  也许你没有启动你的 Mysql 和 Apache 服务器。我从 XAMPP 控制面板启动 Apache 服务器和 Mysql 后,连接成功。

                  祝你好运!

                  【讨论】:

                    【解决方案23】:

                    对我来说解决的是做两件事: 1. 使用以下 connads 使用一些密码创建除 root 以外的新用户:

                    CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
                    GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
                    FLUSH PRIVILEGES;
                    

                    2。在 mysqld.conf 上注释 IP 地址行

                    然后用新的用户名和密码连接。它应该工作。

                    【讨论】:

                    • 您需要对所有远程用户重复此操作,或者添加通配符而不是 Localhost
                    【解决方案24】:

                    它试图连接到旧版本的 MySQL ('version', '5.1.73' );当您使用较新的驱动程序版本时,您会收到一条错误消息,告诉您使用 "com.mysql.cj.jdbc.Driver 甚至您不必指定使用哪个驱动程序:

                    加载类com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver'。司机是 通过 SPI 自动注册并手动加载驱动程序 类通常是不必要的。

                    我将声明更改为使用 mysql-connector-java 的 5.1.38 版本,并且在代码中,我保留了 com.mysql.jdbc.Driver

                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.38</version>
                    </dependency>
                    

                    当我看到 Ankit Jain 的 answer 时,一切都开始了

                    【讨论】:

                      【解决方案25】:

                      我的防火墙阻止了我的 MySQL 监听的 3307 帖子。于是我把端口从3307改成了3306,就可以成功连接数据库了。

                      【讨论】:

                        【解决方案26】:

                        在我的 MacBook 中,我只有在重新安装新版本的 eclipse EE 并删除本地服务器(如 xamp mysql 或 mamp)时才解决此错误,但只使用其中一个...

                        【讨论】:

                          【解决方案27】:

                          我在启动应用程序时遇到了同样的问题,

                          Caused by: 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文件/etc/mysql/mysql.conf.d/mysqld.cnf中,配置是这样的

                          [mysqld]
                          pid-file        = /var/run/mysqld/mysqld.pid
                          socket          = /var/run/mysqld/mysqld.sock
                          datadir         = /var/lib/mysql
                          log-error       = /var/log/mysql/error.log
                          # By default we only accept connections from localhost
                          bind-address    = 127.0.0.1
                          # Disabling symbolic-links is recommended to prevent assorted security risks
                          symbolic-links=0
                          

                          所以我们可以看到绑定地址指向 127.0.0.1,所以为了启动你的应用程序,一个简单的解决方案是我们可以使用 jdbc:mysql://127.0.0.1:3306/pizzeria 而不是 jdbc:mysql://localhost:3306/pizzeria 将 mysql 连接到应用程序或另一个解决方案是您可以检查 mysql 配置并将其更改为默认值。两种解决方案能行得通。 我希望它也对你们有用。

                          【讨论】:

                          • localhost 无论如何都应该通过 DNS 解析到 127.0.0.1
                          【解决方案28】:

                          对于远程调用Mysql

                          1. 远程用户添加到Mysql,例如IP=remoteIP:

                            mysql -u xxxx -p //local coonection to mysql
                            mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
                            //Query OK, 0 rows affected (xx sec)
                            mysql> FLUSH PRIVILEGES;
                            //Query OK, 0 rows affected
                            
                          2. 允许远程访问 Mysql(默认不允许所有外部调用):

                            Edit 
                            /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
                            Change line:  bind-address = 127.0.0.1   to
                                          bind-address = 0.0.0.0
                            Restart Mysql: /etc/init.d/mysql restart
                            
                          3. 对于最新版本的 JDBC 驱动,JDBC :

                            jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
                            jdbc.user='theNewUser'
                            

                          【讨论】:

                            【解决方案29】:

                            打开文件/etc/mysql/my.cnf: 从

                            更改以下参数

                            `绑定地址 = 127.0.0.1

                            bind-address = 0.0.0.0 #这允许所有系统连接

                            在mysql中针对特定IP地址运行以下命令->

                            grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';                      
                            

                            如果您想授予所有 IP 地址的访问权限,请运行以下命令:

                            grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword'; 
                            

                            【讨论】:

                              【解决方案30】:

                              在我的情况下,我必须建立一个到远程数据库的 ssh 隧道,并且所有设置都正确,并且测试与 PhpStorm 的连接也成功。并且还加载了架构,但没有加载数据。相反,我得到了:

                              [08S01] 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.
                              

                              以上建议均无效。出于任何原因,我试图通过简单地重新启动 PhpStorm 来解决问题,瞧,它起作用了!

                              【讨论】:

                                猜你喜欢
                                • 2014-12-31
                                • 1970-01-01
                                相关资源
                                最近更新 更多