【发布时间】:2011-12-13 15:26:52
【问题描述】:
我正在创建一个连接到多个数据库的 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:无法解析“jdbc.peterson”。解决了'jdbc';剩下的名字“彼得森”。
这又是我所期望的,但令我困惑的是,它会抓取最后一个用于不同数据库的良好连接,并处理一切,就好像什么都没发生一样。
有人知道这是为什么吗? weblogic是缓存连接还是故障安全?以这种方式创建连接是一个坏主意吗?
【问题讨论】:
-
您是否尝试将 dbMainConnection 的 catch 范围内的 ds 置空?