我尝试为所有应用程序初始化多个连接池。为了达到这个目的,我写了一个帮助类:
public final class DataBaseHandler {
public static final class DataSources {
public static final DataSource DB1;
public static final DataSource DB2;
public static final DataSource DB3;
public static final DataSource DB4;
static {
try {
Context ctx = new InitialContext();
DB1 = (DataSource) ctx.lookup("jdbc/DB1");
DB2 = (DataSource) ctx.lookup("jdbc/DB2");
DB3 = (DataSource) ctx.lookup("jdbc/DB3");
DB4 = (DataSource) ctx.lookup("jdbc/DB4");
}
catch (NamingException ex) {
throw new ExceptionInInitializerError("DataSource is not initialized");
}
}
}
但是,我尝试在代码中获取这些DataSources
中的任何一个,我会得到DataSource is not initialized
的异常。
这是电话:
DataSource ds = DataBaseHandler.DataSources.DB1;
看起来static
代码的DataSources
部分永远不会被执行。
你知道为什么会这样吗?
答案 0 :(得分:0)
最后,事实证明Context
存在问题。我不得不使用env
上下文:
Context envCtx = (Context) ctx.lookup("java:comp/env");
这是工人阶级:
public final class DataBaseHandler {
public static final class DataSources {
public static final DataSource DB1;
public static final DataSource DB2;
public static final DataSource DB3;
public static final DataSource DB4;
static {
try {
Context ctx = new InitialContext();
Context envCtx = (Context) ctx.lookup("java:comp/env");
DB1 = (DataSource) envCtx.lookup("jdbc/DB1");
DB2 = (DataSource) envCtx.lookup("jdbc/DB2");
DB3 = (DataSource) envCtx.lookup("jdbc/DB3");
DB4 = (DataSource) envCtx.lookup("jdbc/DB4");
}
catch (NamingException ex) {
throw new ExceptionInInitializerError("DataSource is not initialized");
}
}
}
}