2014-12-04 68 views
1

我想用我的Java代码访问安装在我的Web服务器中的MySQL数据库。我的Java应用程序是一个Swing应用程序,运行在我的电脑中。以下是我的Java代码。Java:无法使用JDBC访问远程MySQL数据库

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 

我已经在我的web服务器的CPanel中完成了我的最佳知识来分配远程访问。正如你可以看到下面的图片,我所提供的“任何访问”

enter image description here

,你可以在下面的图片中看到的,我已经建立了数据库,用户和分配用户数据库。

enter image description here

请注意,我在我的代码中提到的IP是假的,只为使用的SO。

+0

对不起,但java代码作为桌面应用程序运行? – Jessai 2014-12-04 15:41:12

+0

@Jessai:是的,这是一个swing应用程序。 – 2014-12-04 15:41:54

+0

我记得有一次我试图在PHP中做同样的事情。您无法连接您的代码的原因是您需要安全和静态的IP。随意纠正如果我错了:D – Jessai 2014-12-04 15:45:58

回答

1

在Google中狩猎我发现this article显示如何连接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:授予权限的用户使用以下命令

[email protected]:~$ sudo mysql -u root -ppasswd 

mysql > GRANT ALL ON *.* TO [email protected]'%' IDENTIFIED BY 'passwd'; 

3 .-添加例外防火墙(我不知道,如果你可以在你的服务器做到这一点)

/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT 

此致敬礼。

+1

''%''将允许来自任何IP地址的连接,并且端口'3306'是默认端口。这一组合是要求僵尸等人尝试暴力强制。我建议或者更改为非标准端口(不是简单的证明,但会过去大多数愚蠢的机器人)和/或限制用户帐户只有它将连接的IP地址(即您的办公室的公共静态IP地址) 。 – SnakeDoc 2014-12-04 16:17:42