2010-12-11 10 views
0

Hier ist ein Teil von meinem Programm:MysqlDataSource Invokes "Connection refused" Exception

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(); 
     ... 

wo

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; 
} 

Wie Sie sehen können, ich versuche, MySQL zu verbinden. Eigentlich ist MySQL in meinem Java-Programm eingebettet. Wenn ich über DriverManager (unter Verwendung con = DriverManager.getConnection("jdbc:mysql:mxj://localhost", "root", "");) verbinde, funktioniert alles. Aber mit einem Datasource-Objekt, wie es oben gezeigt ruft eine Ausnahme:

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) 

Könnte jemand bitte mir helfen?


Einige Tests gesehen, dass mein Programm versucht, auf einen MySQL-Server zu verbinden, die nicht eingebettet ist (BalusC Antwort sehen). Wenn ich den Server starte (nicht eingebettet) funktioniert alles. Also brauche ich einen Weg, mein Programm zu sagen, um das lokale Programm zu starten. Aus irgendeinem Grund ds.setUrl("jdbc:mysql:mxj://"); funktioniert nicht

Antwort

1

Sie versuchen, eine Verbindung zu einem echten MySQL-Server anstelle von einem eingebetteten MySQL-Server.

Ich habe nie versucht es, aber folgendes sollte in der Theorie Arbeit:

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

Also mit genau den gleichen Parametern wie in Ihrem DriverManager#getConnection().

Übrigens ist die InitializeData Sache ziemlich kompliziert. Ich würde vorschlagen, dies zu vereinfachen. Da Sie die Datenquelle manuell erstellen, müssen Sie sie nicht in den JNDI-Bereich einfügen. Erstellen Sie einfach ds und verwenden Sie ds.getConnection() direkt. Der JNDI ist nur nützlich, wenn Sie die Erstellung der Datenquelle an einen JNDI-Container wie einen Java EE-Anwendungsserver delegiert haben.


aktualisieren laut den Kommentaren: es so, dass MysqlDataSource ist aussehen gerade gar nicht für Embedded-MySQL entwickelt. Wenn alles, was Sie wollen, eine Verbindung gepoolten Datenquelle ist, versuchen Sie c3p0. Es sollte universell funktionieren, da es nur die vollständige JDBC-URL, den Benutzernamen und das Passwort benötigt, genau so, wie Sie es an DriverManager übergeben.

+0

Ich habe dies versucht, aber diese Änderungen wieder die Verbindung-verweigert-Ausnahme. – Dmitry

+0

auch nur ds.setUrl ("jdbc: mysql: mxj: //"); funktioniert nicht – Dmitry

+0

Nun, ich denke (einverstanden mit Ihnen =)), dass ich versuche, eine Verbindung zu einem MySQL-Server herzustellen, der nicht eingebettet ist. Wie kann ich mein Programm verwenden, um das eingebettete Programm zu verwenden? – Dmitry

Verwandte Themen