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缓存连接或作为故障安全的东西吗?用这种方式创建连接是一个坏主意吗?
您正在类的静态变量中存储唯一的数据源(以及连接和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)
并且让调用者从数据源获得连接,并在使用完毕后将其关闭。