Java连接到多个数据库

end*_*rjs 3 java oracle weblogic jdbc

我正在创建一个连接多个数据库的Java应用程序。用户将能够从下拉框中选择要连接的数据库。

然后,该程序将名称传递给创建初始上下文的方法,从而连接到数据库,从而可以与oracle Web逻辑数据源进行通讯。

public class dbMainConnection {

    private static dbMainConnection conn = null;
    private static java.sql.Connection dbConn = null;
    private static javax.sql.DataSource ds = null;
    private static Logger log = LoggerUtil.getLogger();

    private dbMainConnection(String database) {

         try {

            Context ctx = new InitialContext();

            if (ctx == null) {
                log.info("JDNI Problem, cannot get InitialContext");
            }

                database = "jdbc/" + database;
                log.info("This is the database string in DBMainConnection" + database);
                ds = (javax.sql.DataSource) ctx.lookup (database);


        } catch (Exception ex) {
            log.error("eMTSLogin: Error in dbMainConnection while connecting to the database : " + database, ex);
        }

    }

    public Connection getConnection() {

        try {

            return ds.getConnection();

        } catch (Exception ex) {
            log.error("Error in main getConnection while connecting to the database : ", ex);
            return null;
        }

    }

    public static dbMainConnection getInstance(String database) {

        if (dbConn == null) {
            conn = new dbMainConnection(database);
        }

        return conn;

    }

    public void freeConnection(Connection c) {
        try {
            c.close();
            log.info(c + "  is now closed");
        } catch (SQLException sqle) {
            log.error("Error in main freeConnection : ", sqle);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果有人忘记创建数据库的数据源,但他们仍然将其添加到下拉框中,该怎么办?现在发生的是,如果我尝试连接到没有数据源的数据库,则会出错,提示无法建立连接。这就是我想要的,但是如果我先连接到具有数据源的数据库(可以正常工作),然后尝试连接到没有数据源的数据库,则再次出现错误

javax.naming.NameNotFoundException:无法解析“ jdbc.peterson”。已解决的“ jdbc”;剩下的名字是“彼得森”。

再次期望,但是让我感到困惑的是,它抓住了另一个数据库的最后一个良好连接,并像处理任何事情一样处理了一切。

有人知道为什么吗?是weblogic缓存连接或作为故障安全的东西吗?用这种方式创建连接是一个坏主意吗?

JB *_*zet 5

您正在类的静态变量中存储唯一的数据源(以及连接和dbMainConnection)。每次有人请求数据源时,都用新数据源替换以前的数据源。如果从JNDI获取数据源时发生异常,则静态数据源将保持原样。您不应该在静态变量中存储任何内容。由于您的dbMainConnection类是用数据库的名称构造的,并且有多个数据库名称,因此使其成为单例是没有意义的。

只需使用以下代码即可访问数据源:

public final class DataSourceUtil {
    /**
     * Private constructor to prevent unnecessary instantiations
     */
    private DataSourceUtil() {
    }

    public static DataSource getDataSource(String name) {
        try {
            Context ctx = new InitialContext();
            String database = "jdbc/" + name;
            return (javax.sql.DataSource) ctx.lookup (database);
        }
        catch (NamingException e) {
            throw new IllegalStateException("Error accessing JNDI and getting the database named " + name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且让调用者从数据源获得连接,并在使用完毕后将其关闭。