我有一个需要连接到两个数据库的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数据库上下文时,这给了我同样的错误。
任何人都可以解释我做错了什么,或者指出我正确的解决方案?感谢
答案 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。