2010-12-11 4 views
0

을 "연결이 거부 됨"내 프로그램에서 일부입니다 : 당신이 볼 수 있듯이MysqlDataSource를 불러옵니다 여기에 예외

try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     InitializeData data = new InitializeData(); 

     Connection con = null; 
     try { 
      Context ctx = data.getContext(); 
      MysqlDataSource ds = (MysqlDataSource)ctx.lookup("database"); 
      con = ds.getConnection(); 
     ... 

public InitializeData() { 

    // configuring data source (data base) 
    ds = new MysqlDataSource(); 
    ds.setUser("root"); 
    ds.setPassword("%"); 
    ds.setServerName("localhost"); 
    ds.setPort(3306); 

    // configuring jndi 
    try { 
     Properties env = new Properties(); 

     try { 
      env.load(new FileInputStream(env_props)); 
     } catch (FileNotFoundException e) { 
      System.err.println("Unable to load jndi properties"); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("IOException"); 
      System.exit(1); 
     } 

     ctx = new InitialContext(env); 
     ctx.rebind("database", ds); 

    } catch (NamingException e) { 
     System.err.println("Naming Exception"); 
     System.exit(1); 
    } 


} 

public Context getContext() { 
    return ctx; 
} 

, 나는 MySQL로 연결을 시도합니다. 사실, MySQL은 내 자바 프로그램에 내장되어 있습니다. (con = DriverManager.getConnection("jdbc:mysql:mxj://localhost", "root", "");을 사용하여) DriverManager를 통해 연결할 때 모든 것이 작동합니다. 그러나 위에 표시된 것처럼 DataSource 객체를 사용하면 예외가 호출됩니다.

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.ConnectException 
MESSAGE: Connection refused: connect 

STACKTRACE: 

java.net.ConnectException: Connection refused: connect 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.PlainSocketImpl.doConnect(Unknown Source) 
at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
at java.net.PlainSocketImpl.connect(Unknown Source) 
at java.net.SocksSocketImpl.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) 
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271) 
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771) 
at com.mysql.jdbc.Connection.<init>(Connection.java:1555) 
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:425) 
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:140) 
at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:110) 
at statistics.DatabaseWorks.main(DatabaseWorks.java:26) 

아무도 도와 주시겠습니까?


일부 테스트 결과 내 프로그램이 포함되지 않은 MySQL 서버에 연결하려고 시도하는 것으로 나타났습니다 (BalusC의 대답 참조). 서버를 임베드하지 않으면 모든 것이 작동합니다. 따라서 지역 프로그램을 시작하는 프로그램을 말하기위한 방법이 필요합니다. 어떤 이유로 든 ds.setUrl("jdbc:mysql:mxj://");이 작동하지 않습니다.

답변

1

내장 MySQL 서버 대신 실제 MySQL 서버에 연결하려고합니다.

나는 그것을 시도 적이 있지만, 다음은 이론 연구에서 수행해야합니다

ds.setUrl("jdbc:mysql:mxj://localhost"); 
ds.setUser("root"); 
ds.setPassword(""); 

그래서 DriverManager#getConnection()와 완전히 같은 매개 변수.

그런데 InitializeData 것은 상당히 복잡합니다. 나는 이것을 단순화 할 것을 제안한다. 데이터 소스를 수동으로 생성하기 때문에 JNDI 범위에 데이터 소스를 전혀 넣지 않아도됩니다. ds을 직접 작성하고 ds.getConnection()을 직접 사용하십시오. JNDI는 Java EE 애플리케이션 서버와 같은 일부 JNDI 컨테이너에 데이터 소스 생성을 위임 한 경우에만 유용합니다.


업데이트 의견에 따라 : 그냥 그 MysqlDataSource 모습은 전혀 포함 된 MySQL을 위해 설계되지 않았습니다. 연결 풀링 된 데이터 소스가 모두 필요한 경우 c3p0을 시도하십시오. DriverManager에 전달한 것과 완전히 동일한 JDBC URL, 사용자 이름 및 암호 만 필요하기 때문에 보편적으로 작동해야합니다.

+0

나는 이것을 시도했지만 이러한 변경은 connection-refused-exception을 다시 제공했다. – Dmitry

+0

또한 ds.setUrl ("jdbc : mysql : mxj : //"); does not work – Dmitry

+0

글쎄, 내 생각에 (당신과 합의했다) =) 임베디드되지 않은 MySQL 서버에 연결하려고한다. 내 프로그램이 임베디드 프로그램을 사용하도록하려면 어떻게해야합니까? – Dmitry