簡體   English   中英

MysqlDataSource調用“連接被拒絕”異常

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

哪里

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://"); 不起作用

您正在嘗試連接到真實的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完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM