在启动时为所有应用程序初始化一次多个连接池

Initialize multiple connection pools once for all application at startup

我正在尝试为所有应用程序初始化多个连接池。为了实现这一点,我写了 helper class:

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;

看起来 DataSources 代码的 static 部分从未被执行。 您知道为什么会发生这种情况吗?

最后发现是Context出了问题。我不得不使用 env 上下文:

Context envCtx = (Context) ctx.lookup("java:comp/env");

工作正常class:

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");
      }
    }
  }
}