11

我在 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:”是什么意思?

谢谢!

4

4 回答 4

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

weblogic.jndi.WLInitialContextFactory

于 2011-06-28T22:50:34.593 回答
6

java是资源的根 JNDI 命名空间。原始代码片段的意思是,最初部署应用程序的容器没有将任何额外的命名空间应用到您检索到的 JNDI 上下文(例如,Tomcat 自动将所有资源添加到命名空间comp/env,所以dataSource = (javax.sql.DataSource) context.lookup("java:comp/env/jdbc/myDataSource");如果资源引用名称是jdbc/myDataSource)。

为了避免更改您的遗留代码,我认为如果您使用名称注册数据源myDataSource(删除jdbc/),您应该没问题。让我知道这是否有效。

于 2011-06-28T03:02:22.210 回答
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 应用程序内部不需要密码和初始上下文工厂。

于 2013-10-09T14:44:46.043 回答
1

我遇到了与此类似的问题。它通过删除java:comp/env/前缀并jdbc/myDataSource在上下文查找中使用来解决。正如评论中有人指出的那样。

于 2013-03-12T23:30:00.700 回答