JDBC:无法连接到数据库服务器

5

我正在尝试使用JDBC连接MySQL数据库。 以下是我的数据库连接类:

public class Database {
    String userName = "myUserName";
    String password = "myPass";

    String url = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/database_Name?autoReconnect=true&useSSL=false";

    public void connect()
    {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();

            Connection conn = DriverManager.getConnection(url,userName,password);

            Statement statement = conn.createStatement();
            String queryString = "select * from users";
            ResultSet rs = statement.executeQuery(queryString);
            while (rs.next()) {
                System.out.println(rs.getString(2));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

目前,您可以假设我像这样调用该方法:

new Database().connect();

我遇到了这个异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2163)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2088)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at Database.<init>(Database.java:17)
    at ServerTest.main(ServerTest.java:8)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
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:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2251)
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2104)
    ... 19 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:211)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
    ... 21 more

*我添加了%来远程访问数据库。

*当我尝试连接远程数据库时,本地主机的Java部分可以正常工作,但是它失败了。

*数据库和表已经创建。(这没有问题。)

那么问题出在哪里呢?


你的 MySql 服务器启动了吗?你的密码和用户名正确吗? - Gatusko
是的,它已经上线了,我的网站也正在该服务器上运行。我尝试了两个不同的用户名和密码,但都无效。 - Ali
我在你的代码中找不到错误。一切都很好。唯一可能有问题的地方是 MySql 服务器的配置,请尝试通过命令行运行查询,看看它是否真的在工作或接受来自其他地方的连接。 - Gatusko
你能够通过 Telnet 连接到数据库服务器吗?你是否已经将服务器更改为绑定在 TCP 上而不是 Unix 套接字(http://www.howtogeek.com/howto/mysql/switch-mysql-to-listen-on-tcp/)? - Bas Dalenoord
java.net.ConnectException: Connection refused: connect 表示您的 MySQL 服务器未运行,未在指定端口上运行,或使用的 IP 地址上的端口未打开,或防火墙正在主动阻止连接。 - Mark Rotteveel
1个回答

3
Java部分在本地主机上工作,但尝试连接远程数据库时失败了。这意味着您的MySQL服务器绑定到localhost并且在外部不可见。请在您的MySQL配置文件中设置bind-address属性为主机的实际IP地址。例如:bind-address=192.168.1.26。通过“实际IP地址”,我指的是在Java代码运行的客户端可见的任何地址,这可能是内部网络地址或公共IP地址。如果您要公开您的公共IP地址,您可能需要使用一些防火墙。

我没有使用VPS。我从一家公司购买了托管服务。我想我没有访问MySQL配置的权限。 - Ali
在这种情况下,必须有一种基于UI的方式来配置您的MySql。 - code
我认为没有一种方法可以配置MySql来为托管客户提供服务。 - Ali
当我防火墙打开时,它对我起作用了。 - Zcon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接