2010-12-11 142 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嵌入在我的java程序中。 當我通過DriverManager連接時(使用con = DriverManager.getConnection("jdbc:mysql:mxj://localhost", "root", "");)一切正常。但是使用如上所示的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。它應該通用,因爲它所需的全部是JDBC URL,用戶名和密碼,與您傳遞給DriverManager的完全相同。

+0

我已經嘗試過,但這些更改再次提供了連接拒絕異常。 – Dmitry 2010-12-11 17:57:27

+0

也只是ds.setUrl(「jdbc:mysql:mxj://」);不起作用 – Dmitry 2010-12-11 18:00:35

+0

嗯,我想(同意你=)),我試圖連接到一個未嵌入的MySQL服務器。我如何讓我的程序使用嵌入式程序? – Dmitry 2010-12-11 18:04:00