MysqlDataSource调用“连接被拒绝”异常

时间:2010-12-11 17:34:43

标签: java mysql jdbc

以下是我的计划的一部分:

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 个答案:

答案 0 :(得分: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时完全相同。