Java:无法使用JDBC访问远程MySQL数据库

Java:无法使用JDBC访问远程MySQL数据库,java,mysql,networking,jdbc,cpanel,Java,Mysql,Networking,Jdbc,Cpanel,我正在尝试使用Java代码访问MySQL数据库,它安装在我的Web服务器中。我的Java应用程序是一个Swing应用程序,运行在我的PC上。下面是我的Java代码 import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.sql.Connection; import java.sql.DriverManager; import java.util.logging.Level;

我正在尝试使用Java代码访问MySQL数据库,它安装在我的Web服务器中。我的Java应用程序是一个Swing应用程序,运行在我的PC上。下面是我的Java代码

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;


public class TestDatabase {

    private Connection con;

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


             con = DriverManager.getConnection("jdbc:mysql://72.0.0.0:3306/aceko_test","aceko_me","rtf7890");

             System.out.println("Connection Established");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[]args)
    {
        new TestDatabase().connect();
    }

}
我得到下面的错误

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:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:358)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2498)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2535)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2320)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    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:408)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at TestDatabase.connect(TestDatabase.java:31)
    at TestDatabase.main(TestDatabase.java:43)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
    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 java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:244)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:308)
    ... 16 more
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:408)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129)
位于com.mysql.jdbc.MysqlIO(MysqlIO.java:358)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2498)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2535)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2320)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:834)
JDBC4Connection.(JDBC4Connection.java:46)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:408)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347)
位于java.sql.DriverManager.getConnection(DriverManager.java:664)
位于java.sql.DriverManager.getConnection(DriverManager.java:247)
位于TestDatabase.connect(TestDatabase.java:31)
位于TestDatabase.main(TestDatabase.java:43)
原因:java.net.ConnectException:连接超时:连接
位于java.net.DualStackPlainSocketImpl.connect0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于java.net.Socket。(Socket.java:434)
位于java.net.Socket(Socket.java:244)
位于com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:308)
... 还有16个
我在web服务器的
CPanel
中尽了最大努力来分配远程访问。如下图所示,我提供了“任意访问”

如下图所示,我创建了数据库user,并将该用户分配给数据库

请注意,我在代码中提到的IP是假的,仅用于SO。

在谷歌搜索时,我发现它显示了如何连接DBMS,但它是西班牙语的。不管怎样,我试着写这篇文章:

1.-修改/etc/mysql/my.cnf文件 您必须注释跳过外部锁定绑定地址条目

    [mysqld]
    #
    # * Basic Settings
    #
    user            = mysql
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    port            = 3306
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp
    lc-messages-dir = /usr/share/mysql
    #skip-external-locking
    #
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    #bind-address           = 127.0.0.1
2.-使用以下命令向用户授予权限

haciendoti@haciendoti:~$ sudo mysql -u root -ppasswd

mysql > GRANT ALL ON *.* TO haciendoti@'%' IDENTIFIED BY 'passwd';
3.-将异常添加到防火墙(我不知道您是否可以在服务器上执行此操作)


致意。

很抱歉问这个问题,java代码是作为桌面应用程序运行的?@Jessai:是的,它是一个swing应用程序。我记得有一次我尝试用PHP做同样的事情。无法使用代码连接的原因是您需要一个安全的静态IP。如果我错了,请随意更正:网络连接被阻止,防火墙可能?。检查您是否可以从运行代码的机器上实际访问MySQL数据库的IP和端口。telnet对“telnet”有用@dethorpe:trusted telnet,它说
连接失败
。我甚至暂停了Kasperky Internet安全。
“%”
将允许从任何ip地址进行连接,端口
3306
是默认端口。这一组合要求机器人等尝试暴力强迫。我建议更改为非标准端口(不是傻瓜式的,但会通过大多数愚蠢的机器人程序)和/或将用户帐户限制为其连接所需的IP地址(即您办公室的公共静态IP地址)。
/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT