我试图连接到本地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有跳过网络选项注释掉。

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

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


当前回答

正如上面的详细回答所说,这个错误可能是由许多事情引起的。

我也有这个问题。我的设置是Mac OSX 10.8,使用Vagrant管理的VirtualBox虚拟机,Ubuntu 12.04, MySQL 5.5.34。

我已经在Vagrant配置文件中正确地设置了端口转发。我可以从我的Mac和VM中远程登录到MySQL实例。因此,我知道MySQL守护进程正在运行并且可以访问。但是当我试图通过JDBC连接时,我得到了“通信链路失败”错误。

在我的例子中,通过编辑/etc/mysql/my.cnf文件解决了这个问题。具体来说,我注释掉了“#bind-address=127.0.0.1”行。

其他回答

在我的案例中,Soheil提供的解决方案是成功的。

澄清一下,我唯一需要做的改变是MySQL的服务器配置;

bind-address = **INSERT-IP-HERE**

我正在为我的应用程序使用一个外部MySQL服务器。它是一个基本的Debian 7.5安装MySQL服务器5.5 -默认配置。

重要的是:

始终备份您可能修改的任何配置文件的原始文件。当被提升为超级用户时一定要小心。

File

/etc/mysql/my.cnf

Line

bind-address        = 192.168.0.103 #127.0.0.1

重新启动MySQL服务器:

/usr/sbin/service mysql restart

如您所见,我只是提供了服务器的网络IP,并注释掉了默认条目。请注意,简单地复制和粘贴我的解决方案不会为您工作,除非奇迹我们的主机共享相同的IP。

谢谢@ Soheil

进入控制面板的“Windows服务”,启动MySQL服务。对我来说,这很有效。当我在做一个Java EE项目时,我得到了这个错误“通信链路故障”。我重启了我的系统,然后它就工作了。

之后,我再次得到相同的错误,即使重新启动我的系统。然后我尝试打开MySQL命令行控制台并以root登录,即使这样它也给了我一个错误。

最后,当我从Windows服务启动MySQL服务时,它工作了。

如果您正在使用hibernate,则此错误可能是由于保持打开Session对象的时间超过wait_timeout而导致的

我在这里记录了一个案例感兴趣的人可以看看。

我找到了解决办法

因为MySQL需要Localhost才能工作。

进入/etc/network/interfaces文件,确保设置了本地主机配置:

auto lo
iface lo inet loopback

现在重启网络子系统和MySQL服务:

sudo /etc/init.d /网络重启

sudo /etc/init.d/mysql restart

现在试试吧

在我的例子中,这是一个空闲超时,导致连接在服务器上断开。连接保持打开状态,但长时间没有使用。然后客户端重新启动工作,而我相信重新连接也会工作。

一个不错的解决方案是使用一个守护进程/服务来不时地ping连接。