我试图连接到本地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

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


当前回答

如果您正在使用本地模拟器,您必须使用IP地址10.0.2.2而不是localhost来访问本地MySQL服务器。

其他回答

对我来说,解决方案是在mysql服务器的conf文件中修改参数bind-address="127.0.0.1"或bind-address=" x.x.x.x "。to bind-address="0.0.0.0"。 谢谢。

我只是重新启动MySQL(从这里的提示:https://stackoverflow.com/a/14238800),它解决了这个问题。

我在通过homebrew安装的MacOS(10.10.2)和MySql(5.6.21)上也有同样的问题。

令人困惑的是,我的一个应用程序可以连接到数据库,而另一个则不能。

在应用程序上尝试了许多东西,抛出了com.mysql.jdbc.CommunicationsException异常,这是这个问题的公认答案所建议的,但没有效果,我很惊讶重新启动MySQL工作了。

我的问题的原因可能如下所示,在上述链接的回答:

您是否使用连接池?如果是,请尝试重新启动 服务器。连接池中可能只有少数连接处于关闭状态。

这主要是因为mysql客户端和远程mysql服务器之间的连接很弱。

在我的情况下,这是因为不稳定的VPN连接。

就我而言,

修改远程机器mysql的配置:/etc/mysql/my.cnf: Change Bind-address = 127.0.0.1 来 #bind-address = 127.0.0.1 在远程机器上,将mysql用户权限更改为 授予*上的所有特权。*到'用户'@'%'由'密码'识别; 注意:在远程机器上重新启动mysql: sudo /etc/init.d / mysql重启

我知道这是一个老线程,但我已经尝试了许多事情,并使用以下方式解决了我的问题。

我正在Windows上开发一个跨平台应用程序,但要在Linux和Windows服务器上使用。

一个名为“jtm”的MySQL数据库安装在两个系统上。出于某种原因,在我的代码中,我将数据库名称设置为“JTM”。在Windows系统上运行得很好,事实上在几个Windows系统上都运行得很好。

在Ubuntu上,我一次又一次地得到上面的错误。我在代码“jtm”中用正确的情况进行了测试,它工作得很好。

Linux显然对大小写敏感不那么宽容(这是正确的),而Windows则允许。

我现在觉得有点傻,但检查一切。错误信息并不是最好的,但如果你坚持并把事情做好,它似乎是可以修复的。