在J2EE中使用多个上下文连接到不同的数据源(Websphere)

sim*_*005 0 websphere application-server java-ee

我有一个需要连接到两个数据库的Java EE应用程序.一个是内存数据库(H2),一个是常规Oracle数据库.

我可以在Websphere Application Server中建立与Oracle数据库的连接,在ibm-web-bnd.xml中放置一个引用,然后使用以下代码访问它:

DataSource dataSource = null;
try 
{
    InitialContext ctx = new InitialContext();
    // comp/env is for component-environment bindings, such as web application bindings
    // this allows us to change the name later in the binding (in the ibm-web-bnd.xml file), instead of here in the code.

    dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/refDB");
}
catch (NamingException e)
{
    e.printStackTrace();
}

return dataSource.getConnection();
Run Code Online (Sandbox Code Playgroud)

这很好 - InitialContext返回我需要的WAS上下文,可以找到数据源,一切都很好.

但是,我还希望能够从同一个应用程序访问H2数据库.按照我在复数视频上找到的教程,似乎这样做的方法是导入tomcat jar,然后即时创建上下文:

System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.naming.java.javaURLContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");

InitialContext ctx = new InitialContext();

//"java:comp/env/jdbc/CacheDb" is the context that needs creating here.
ctx.createSubcontext("java:");
ctx.createSubcontext("java:comp");
ctx.createSubcontext("java:comp/env");
ctx.createSubcontext("java:comp/env/jdbc");

JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL("jdbc:h2:mem:cachedb;DB_CLOSE_DELAY=-1"); // don't delete the database when the last connection closes

ctx.bind("java:comp/env/jdbc/CacheDb", dataSource);
Run Code Online (Sandbox Code Playgroud)

如果它是应用程序中唯一的连接代码,那么此代码也可以工作.

如果我有一个应用程序,在某些时候调用它们,我会得到如下错误:

SystemErr R javax.naming.NoInitialContextException:无法找到InitialContextFactory org.apache.naming.java.javaURLContextFactory.

然后我想,好吧,也许System.setProperty代码导致错误的上下文用于Oracle查找 - 所以我尝试在获取Oracle连接的InitialContext之前使用以下代码专门指定WAS上下文:

System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
System.setProperty(Context.URL_PKG_PREFIXES, "com.ibm.websphere.naming");
Run Code Online (Sandbox Code Playgroud)

但是,在配置H2数据库上下文时,这给了我同样的错误.

任何人都可以解释我做错了什么,或者指出我正确的解决方向?谢谢

F R*_*owe 5

我假设你使用的是WebSphere Application Server,而不是Liberty.可以通过DataSource访问h2数据库,就像任何其他JDBC兼容数据库一样.听起来您已经为Oracle配置了jdbc提供程序和DataSource.您只需按照IBM KnowledgeCenter主题中的说明为h2创建和配置用户定义的jdbc提供程序和关联的数据源.由于您在web.xml中配置了资源引用,因此让应用服务器为您完成工作,并将这两个数据源注入您的应用程序中

@Resource(lookup="jdbc/refDB")
DataSource oracleDS;
@Resource(lookup="jdbc/CacheDb")
DataSource h2DS;
Run Code Online (Sandbox Code Playgroud)

您不需要在JNDI中进行直接查找(也不应该),也不必担心InitialContext.