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

时间:2018-01-16 11:43:17

标签: java-ee websphere application-server

我有一个需要连接到两个数据库的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();

这很好用 - 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);

如果它是应用程序中唯一的连接代码,则此代码也可以使用。

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

  

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

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

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

1 个答案:

答案 0 :(得分:5)

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

        Best2 position = new Best2(1);

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