无法从WebSphere数据源

时间:2015-07-21 12:20:42

标签: oracle java-ee jdbc websphere datasource

我尝试连接到Oracle数据库(检查连接状态)。我使用以下代码,效果很好。

public String getDatabaseStatus() {
    Connection conn;
    try {
        conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.70:1521:XE", "foo","bar");
        conn.close();
    } catch (Exception e) {
        return "ERR - " + e.getMessage();
    }
    return "Connection succesful";
}

但是,使用Websphere数据源时,10(连接限制)刷新页面后会挂起。代码:

public String getDatabaseStatus() {
    Connection conn;
    try {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
        conn = WSCallHelper.getNativeConnection(ds.getConnection());
    } catch (Exception e) {
        return "ERR - " + e.getMessage();
    }
    return "Connection succesful";
}

我尝试关闭提供的连接,但它给了我错误:

  

J2CA0206W - 发生连接错误。要帮助确定问题,请启用“连接工厂”或“数据源”上的“诊断连接使用情况”选项。这是多线程访问检测选项。或者,检查数据库或MessageProvider是否可用。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您必须关闭从DataSource收到的连接:

public String getDatabaseStatus() {
    Connection conn;
    try {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
        java.sql.Connection connection = ds.getConnection();
        try {
            conn = WSCallHelper.getNativeConnection(connection);
        } finally {
            safeClose(connection);
        }
    } catch (Exception e) {
        return "ERR - " + e.getMessage();
    }
    return "Connection succesful";
}

private void safeClose(java.sql.Connection connection) {
    try {
        connection.close();
    } catch (SQLException e) {
        log.warn("Failed to close database connection", e);
    }
}

如果您使用的是Java 7或更高版本,则可以将其简化为:

public String getDatabaseStatus() {
    Connection conn;
    try {
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("jdbc/xe");
        try (java.sql.Connection connection = ds.getConnection()) {
            conn = WSCallHelper.getNativeConnection(connection);
        }
    } catch (Exception e) {
        return "ERR - " + e.getMessage();
    }
    return "Connection succesful";
}

如果您没有这样做,您的连接将不会返回到池中,并且您的连接将用尽。