2014-12-04 3 views
1

Java 코드를 사용하여 웹 서버에 설치된 MySQL 데이터베이스에 액세스하려고합니다. 내 Java 응용 프로그램은 내 PC에서 실행중인 Swing 응용 프로그램입니다. 아래 자바 코드입니다.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 

나는 원격 액세스를 할당하는 내 웹 서버의 CPanel에서 최고의 내 지식을 했어요. 당신은 이미지 아래에서 볼 수 있듯이, 나는 "모든 액세스"당신은 아래 이미지에서 볼 수 있듯이, 나는 데이터베이스, 사용자가 만든

enter image description here

을 제공하고, 데이터베이스에 사용자를 할당했다.

enter image description here

내 코드에서 언급 한 IP는 SO의 사용을 위해, 가짜 유의하시기 바랍니다.

+0

미안하지만 자바 코드가 데스크톱 응용 프로그램으로 실행되고 있습니까? – Jessai

+0

@ 예래 : 예, 스윙 어플입니다. –

+0

나는 PHP에서 같은 것을 시도한 것을 기억한다. 코드에 연결할 수없는 이유는 안전하고 정적 인 IP가 필요하기 때문입니다. 기꺼이 수정 해주세요. 내가 틀렸다면 : D – Jessai

답변

1

구글에서 사냥 난 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'는 기본 포트입니다. 이 조합은 봇 (bots) 외에도 무차별 대입 (brute forcing)을 시도하고 있습니다. 나는 비표준 포트로 바꿀 것을 권하고 싶다. (바보 같은 증거는 아니지만 대부분의 멍청한 봇을 지나칠 것이다.) 그리고/또는 사용자 계정을 필요한 IP 주소 (즉, 사무실의 정적 IP 주소) . – SnakeDoc

관련 문제