【问题标题】:Unable to access weblogic datasource from java with prefix jdbc/无法从带有前缀 jdbc/ 的 java 访问 weblogic 数据源
【发布时间】:2013-09-05 23:41:56
【问题描述】:

我在 weblogic 中创建了两个具有以下 jndi 名称的数据源

  • jdbc/testDatasource
  • testDatasource1

我可以使用 java 访问数据源 testDatasource1,但是在访问 dataource jdbc/testDatasource 时出现以下错误

javax.naming.NameNotFoundException: While trying to lookup 'jdbc.testDatasource' didn't find subcontext 'jdbc'. Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying to lookup 'jdbc.testDatasource' didn't find subcontext 'jdbc'. Resolved '']; remaining name 'jdbc/testDatasource'

似乎前缀 jdbc/ 有问题。

【问题讨论】:

    标签: java jdbc weblogic datasource


    【解决方案1】:

    在某些情况下,它是由于数据源与您的服务器不在同一目标中造成的。使用数据源的服务器应添加到相同的目标中。

    【讨论】:

    • 是的,这是导致此错误的最常见原因。导航到:“主页 >JDBC 数据源摘要 >JDBC 数据源-0”:目标选项卡并将服务器(例如 AdminServer)分配为目标
    • 除上述之外,请确保 JDNI 名称没有任何多余的空格,这也会抛出此错误“avax.naming.NameNotFoundException: While trying to lookup”
    【解决方案2】:

    可能听起来很愚蠢,但既然它发生在我身上,我会分享它。

    在Weblogic(至少10.3.4)下创建数据源时,别忘了走完整个配置过程(Finish按钮在结束前启用)。

    在最后一页,您将能够activate 用于服务器的数据源,而不仅仅是创建它。

    要检查您的数据库是否已启动,您可以查看服务器的 JNDI 树。

    【讨论】:

    • 帮助我找到了答案!
    • 最糟糕的是,我看到了 next 旁边的那个按钮,我有一种直觉,但让自己冷静下来,说:“我还需要定义什么? ”。当我看到你的回答时,我就像......“是的,就是我”
    • 这其实就是答案。您需要针对特定​​的服务器实例。
    【解决方案3】:

    我也遇到过同样的问题。我的应用程序正在连接到在本地 Oracle Sql Server (Oracle XE 11g) 上运行的 Oracle DB。从其他答案中,我看到删除 Weblogic 缓存 /tmp、/cache 甚至 /logs 可能会起作用。我的问题是本地服务 Oracle Service XE 已停止。我知道这很愚蠢,但它可能会有所帮助。所以你应该做这三件事:
    - 清除缓存;
    - 检查数据库服务器服务是否正在运行;
    - 尝试重新启动 WEBLOGIC 服务器; 以上这些对我有用。

    【讨论】:

      【解决方案4】:

      java 是资源的根 JNDI 命名空间。

      所以也许你需要

      dataSource = (javax.sql.DataSource) context.lookup("java:jdbc/testDatasource");
      

      【讨论】:

      • 得到相同的错误 javax.naming.NameNotFoundException:尝试查找“java:jdbc.testDatasource”时未找到子上下文“java:jdbc”。已解决“”[根异常是 javax.naming.NameNotFoundException:尝试查找“java:jdbc.testDatasource”时未找到子上下文“java:jdbc”。解决 ''];剩余名称 'java:jdbc/testDatasource'
      • 你想发布你的 jndi 声明吗?
      • prop.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); prop.put(Context.PROVIDER_URL, "t3://localhost:8001/"); prop.put(Context.SECURITY_PRINCIPAL, "weblogic"); prop.put(Context.SECURITY_CREDENTIALS, "welcome1");上下文 ctx = new InitialContext(prop);字符串 dsName = "java:jdbc/testDatasource";数据源 ds=(DataSource)ctx.lookup(dsName);
      • 不,这不是 jndi 声明。查找 xml 文件。
      • 您好,对不起,我没有找到您。我在 main 方法中运行它,我可能知道这个 xml 文件的位置,因为我还没有创建它。
      【解决方案5】:

      当我们在 weblogic 中的两个数据源中定义了相同的 JNDI 名称时也会发生此错误(我创建了两个用于测试数据源的不同属性)。我不得不删除其中一个,但效果很好。

      【讨论】:

        【解决方案6】:

        在设置 PROD 服务器时,我的应用程序也遇到了同样的问题。

        Sol:针对 Web 逻辑控制台(节点或集群)中的数据源。 它对我有用。

        导航: 在 Console 中:转到 JDBC >Summary of JDBC Data Sources >DataSource1>选择要在其上部署此 JDBC 数据源的服务器或集群。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题,现在已经解决了:)

          解决办法是,

                  String DATASOURCE_CONTEXT = prop.getProperty("tcDataSourceContext");
                  log("DATASOURCE_CONTEXT.."+DATASOURCE_CONTEXT);
                  Properties env = new Properties( ); 
                  env.put(Context.INITIAL_CONTEXT_FACTORY,                                                                                                "weblogic.jndi.WLInitialContextFactory"); 
                  env.put(Context.PROVIDER_URL,"t3://abc.com:8001");
                  Context initialContext = new InitialContext(env);
                  DataSource datasource =        (DataSource)initialContext.lookup(DATASOURCE_CONTEXT);
                  if (datasource != null) {
                      conn = datasource.getConnection();
                  }
                  else{
                      log("Failed to lookup datasource.");
                  } 
          

          1#。 abc.com 是部署 WebLogic 的服务器 URL。 2#。 8001 是 WebLogic Admin 服务器正在侦听的端口号。

          3#。确保以下配置正确。

          一个错误: tcDataSourceContext=java:comp/env/jdbc/datasourcename

          正确的一个: tcDataSourceContext=jdbc/数据源名称

          4#。此外,转到 WebLogic 服务器并导航到 /Oracle/Middleware/wlserver_10.3/server/lib/ 并执行以下命令。

          命令: java -jar wljarbuilder.jar -profile wlfullclient5

          上述命令创建一个 jar 文件,其中包含 WebLogic 服务器/lib 文件夹中的所有 jar 文件,并将其放置在您的客户端 java 代码构建路径和 server/lib 文件夹中。

          希望这会有所帮助!如果您有任何问题,请告诉我。

          【讨论】:

            【解决方案8】:

            在我的情况下,这是由于数据源在部署期间被破坏。解决方法是添加destroyMethod=""

            @Bean(name = "dataSource", destroyMethod="")
            public DataSource dataSource() {
            
              JndiDataSourceLookup lookup = new JndiDataSourceLookup();
              return lookup.getDataSource(jndiName);
            
            }
            

            【讨论】:

              【解决方案9】:

              我遇到了这个异常:

              javax.naming.NameNotFoundException: While trying to lookup 'jdbc.test_group_ir' didn't find subcontext 'jdbc'. Resolved ''; remaining name 'jdbc/test_group_ir'
                  at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:1224)
              

              从 weblogic 控制台测试到数据库的连接给出:

               Error weblogic.common.resourcepool.ResourceSystemException: Could not create connection for datasource 'test_group_ir_pool'. The returned message is: ORA-01017: invalid username/password;
              

              看来密码错误,这不是你的情况,因为第一个异常是通用的,可能有不同的原因,有些已经解释了以前的答案,所以我只是添加我的。

              修复密码并测试数据库连接:

              【讨论】:

                【解决方案10】:

                对我有用的是通过删除 C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer 中的 Temp 文件夹来清除 WebLogic 缓存。确保在这样做之前停止服务器。

                【讨论】:

                  【解决方案11】:

                  尝试以下操作,确保 Context.PROVIDER_URL 中的端口是您要运行应用程序的 weblogic 服务器的端口。

                  Context ctx = null;
                  Hashtable ht = new Hashtable();
                  ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
                  ht.put(Context.PROVIDER_URL,"t3://localhost:8002");
                  
                  Connection conn = null;
                  Statement stmt = null;
                  ResultSet rs = null;
                  
                  try {
                  out.println("Connecting to DB......");
                  ctx = new InitialContext(ht);
                  javax.sql.DataSource ds= (javax.sql.DataSource) ctx.lookup ("jdbc/postdbsrc");
                  conn = ds.getConnection();
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-03-27
                    • 2016-05-03
                    • 2015-03-11
                    • 2012-07-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-02-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多