gpt4 book ai didi

Java连接多个数据库

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:54 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com