Java连接多个数据库

标签 java oracle jdbc weblogic

我正在创建一个连接到多个数据库的 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);
        }
    }

}

我的问题是,如果有人忘记为数据库创建数据源,但他们仍然将其添加到下拉框中,会发生什么情况?现在发生的情况是,如果我尝试连接到一个没有数据源的数据库,它会出错,说它无法建立连接。这就是我想要的,但是如果我首先连接到一个确实有数据源的数据库,它可以工作,然后尝试连接到没有数据源的数据库,它又会出错

javax.naming.NameNotFoundException: Unable to resolve 'jdbc.peterson'. Resolved 'jdbc'; remaining name 'peterson'.

这又是我所期望的,但让我感到困惑的是,它随后会获取针对不同数据库的最后一个良好连接,并像什么都没发生一样处理所有内容。

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

最佳答案

您在类的static 变量中存储了一个唯一的数据源(以及连接和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);
        }
    }
}

并让调用者从数据源获取连接并在使用完毕后关闭它。

关于Java连接多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8491729/

相关文章:

java.sql.SQLException : The Network Adapter could not establish the connection

java - 自动提交并不总是发生

Java - 具有预定义继承值的构造函数

java - Apache Commons Email,如何使用 Content-Transfer-Type 作为 quoted-printable 发送电子邮件附件?

java - 实体、服务类和命令对象的最佳实践问题

java - 使用 JDBC 读取 Oracle DB 中的 XMLType 列

mysql - mysql中Connections_connected和线程连接的区别

java - 使用 ASM 生成接口(interface)不起作用

c# - 在 C# 应用程序中使用具有返回值的 Oracle 函数

sql - Oracle 中的 NVL 和 NVL2 函数是什么?它们有何不同?