首页 文章

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

提问于
浏览
157

我正在努力让我的数据库与我的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?");
    }
}

29 回答

  • 200

    所以,你有一个

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败java.net.ConnectException:连接被拒绝

    我引用了this answer,其中还包含一步一步的MySQL JDBC教程:

    如果您收到SQLException:连接被拒绝或连接超时或MySQL特定的CommunicationsException:通信链接失败,则表示根本无法访问数据库 . 这可能有以下一个或多个原因:JDBC URL中的IP地址或主机名错误 . 本地DNS服务器无法识别JDBC URL中的主机名 . JDBC URL中的端口号丢失或错误 . 数据库服务器已关闭 . 数据库服务器不接受TCP / IP连接 . 数据库服务器已用完连接 . Java和DB之间的某些东西阻止了连接,例如防火墙或代理 . 要解决这些问题,请遵循以下建议:使用ping验证并测试它们 . 刷新DNS或使用JDBC URL中的IP地址 . 根据MySQL DB的my.cnf进行验证 . 启动数据库 . 验证是否在没有--skip-networking选项的情况下启动mysqld . 重新启动数据库并相应地修改代码,以便最终关闭连接 . 禁用防火墙和/或配置防火墙/代理以允许/转发端口 .

    另见:

  • -1

    当Java出堆时我 grab 了这个异常 . 如果我尝试在RAM中放入许多数据项 - 首先我 grab “ Communications link failure " and next " OutOfMemoryError ” .

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

  • 7

    如果数据库连接长时间处于空闲状态,则会发生 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException 异常 .

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

  • 3

    我可能在这里咆哮错误的树,但你的异常似乎表明你的MySQL服务器不可用 .

    线程“main”中的异常com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败成功发送到服务器的最后一个数据包是0毫秒前 . 驱动程序未收到来自服务器的任何数据包 . 在...

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

    mysql -u username -p
    

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

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

  • 0

    几个小时我一直有同样的问题 . 我正在使用MAMP服务器

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

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

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

    这是最好的解决方案,

    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");
    

    将Localhost替换为您的IP地址

  • 0

    Mysql下载MySQL-JDBC-Type-4-Treiber(例如'mysql-connector-java-5.1.11-bin.jar',来自'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" );
    
  • 0

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

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

  • 2

    在我的情况下,结果是 mysql-connector-java 的版本很高 .

    在我的演示中,我以某种方式使用_1169721这样:

    <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(是的,它很老,仅仅是为了模仿产品版本) . 所以我遇到了同样的错误 .

    由于找到了原因,因此也找到了解决方案 . 匹配版本!

  • 2

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

    bind-address  = <IP_ADDRESS>
    

    重启mysql deamon和mysql服务 .

  • 3

    早期的答案是恰当的 . 但是,我还想指出一个更普遍的问题 .

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

    当我在任何其他网络时,相同的连接获得成功 .

  • 3

    刚刚经历过这个 .

    必须使它工作:(这可以放在静态块初始化器中)

    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");
    

    问候 .

  • 0

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

  • 3

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

    • 转到my.cnf

    vi /etc/mysql/my.cnf

    • 修改其绑定地址

    "#bind-address = 127.0.0.1"

    • 重启mysql

    sudo /etc/init.d/mysql restart

  • 0

    我以一种简单的方式解决了这个问题,这对我有用 . 我有seme问题“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure” . 在我的db.properties文件中我有这个:url:jdbc:mysql:// localhost:90 / myDB,只删除了端口url,导致这种方式url:jdbc:mysql:// localhost / myDB对我有用 .

  • 5

    当我在my.ini和php.ini文件中将mysql端口从3306更改为3307但在更改端口(3307-> 3306)之后再次正常工作时,这件事发生在我身上 .

  • 0

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

  • 5

    For Remote Call to Mysql

    • 将远程用户添加到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
    
    • 允许远程访问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 = 127.0.0.1
    Restart Mysql: /etc/init.d/mysql restart
    
    • 对于最新版本的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'
    
  • 2

    我有同样的问题,这是如何解决的:

    • 我的.jsp正在调用我尚未在servlet中定义的属性 .

    • 我有两个列名,我通过 ResultSet (getString("columnName")) 传递给一个与我的数据库中的列名不匹配的对象 .

    我不确定哪一个解决了这个问题,但它确实奏效了 . 此外,请确保为每个表查询创建新的 StatementResultSet .

  • 1

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

  • 2

    尝试将 localhost 更改为 127.0.0.1 .

    localhost将被解析为 ::1 . 默认情况下,MySQL无法通过IPv6连接 .

    这是 telnet localhost 3306 的输出:

    $ telnet localhost 3306
    Trying ::1...
    

    MySQL服务器没有响应 .

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

  • 0

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

    祝好运!

  • 6

    为我解决的是做两件事:1 . 使用以下connads创建除root之外的新用户:

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

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

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

  • 0

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

    加载类com.mysql.jdbc.Driver' . 这已被弃用 . 新的驱动程序类是com.mysql.cj.jdbc.Driver' . 驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类 .

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

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

    一切都是在我看到Ankit Jain的answer时开始的

  • 4

    我的防火墙阻止了我的MySQL监听的帖子3307 . 所以我将端口从3307更改为3306.然后我可以成功连接到数据库 .

  • 2

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

  • 2

    我在开始申请时遇到了同样的问题,

    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配置更改为default.Both解决方案可以工作 . 我希望它对你们也有用 .

  • 0

    打开文件/etc/mysql/my.cnf:从下面更改参数

    bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address

    在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';
    
  • 0

    如果有任何读者在访问远程服务器时遇到此问题:请确保端口已打开

相关问题