我在WebLogic 11g上部署了遗留应用程序。该应用程序具有以下代码:
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("java:myDataSource");
我还在WebLogic中配置了一个数据源,其JNDI名称为:
jdbc/myDataSource
当上面的java代码运行时,我得到以下异常:
javax.naming.NameNotFoundException: While trying to look up /myDataSource in /app/webapp/axis2.war/60105275.; remaining name '/myDataSource'
at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1139)
at weblogic.jndi.internal.ApplicationNamingNode.lookup(ApplicationNamingNode.java:144)
我对JNDI很新,所以我的问题是?命名的断开在哪里?当上下文查找的前缀为“java:”时,这意味着什么?
谢谢!
答案 0 :(得分:8)
你应该能够做到这一点:
Context context = new InitialContext();
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
如果从远程目的地查找,则需要使用WL初始上下文工厂,如下所示:
Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, pURL); //For example "t3://127.0.0.1:7001"
h.put(Context.SECURITY_PRINCIPAL, pUsername);
h.put(Context.SECURITY_CREDENTIALS, pPassword);
InitialContext context = new InitialContext(h);
dataSource = (javax.sql.DataSource) context.lookup("jdbc/myDataSource");
答案 1 :(得分:6)
java
是资源的根JNDI名称空间。最初的代码片段意味着最初部署应用程序的容器没有将任何其他命名空间应用于您检索的JNDI上下文(例如,Tomcat会自动将所有资源添加到命名空间comp/env
,因此您如果资源引用名称为dataSource = (javax.sql.DataSource) context.lookup("java:comp/env/jdbc/myDataSource");
,则必须执行jdbc/myDataSource
。
为了避免更改遗留代码,我认为如果您使用名称myDataSource
注册数据源(删除jdbc/
),那么您应该没问题。如果有效,请告诉我。
答案 2 :(得分:1)
我遇到了类似的问题。它通过删除java:comp/env/
前缀并在上下文查找中使用jdbc/myDataSource
来解决。正如有人在评论中指出的那样。
答案 3 :(得分:1)
我只需要更新传统的Weblogic 8应用程序以使用数据源而不是硬编码的JDBC字符串。 Weblogic管理员配置选项卡上的数据源JNDI名称显示:“weblogic.jdbc.ESdatasource”,下面有两种工作方式:
Context ctx = new InitialContext();
DataSource dataSource;
try {
dataSource = (DataSource) ctx.lookup("weblogic.jdbc.ESdatasource");
response.getWriter().println("A " +dataSource);
}catch(Exception e) {
response.getWriter().println("A " + e.getMessage() + e.getCause());
}
//or
try {
dataSource = (DataSource) ctx.lookup("weblogic/jdbc/ESdatasource");
response.getWriter().println("F "+dataSource);
}catch(Exception e) {
response.getWriter().println("F " + e.getMessage() + e.getCause());
}
//use your datasource
conn = datasource.getConnection();
这就是所有人。从Weblogic应用程序内部无需密码和初始上下文工厂。