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

时间:2015-08-12 08:51:01

标签: java database java-ee connection tomcat7

我尝试为所有应用程序初始化多个连接池。为了达到这个目的,我写了一个帮助类:

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部分永远不会被执行。 你知道为什么会这样吗?

1 个答案:

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