无法通过Java访问带有前缀jdbc/的WebLogic数据源

12

我在Weblogic中创建了两个数据源,其JNDI名称如下:

  • jdbc/testDatasource
  • testDatasource1

我能够使用Java访问testDatasource1数据源,但是当我访问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/会导致问题。

11个回答

21

在某些情况下,这是由于数据源与您的服务器不在同一个目标中引起的。正在使用该数据源的服务器应该添加到相同的目标中。


3
是的,这通常是出现此错误的最常见原因。进入以下路径:"主页 > JDBC 数据源概述 > JDBC 数据源-0" : 目标选项卡,并将服务器(例如 AdminServer)分配为目标。 - Marek-A-
除了以上内容外,请确保JDNI名称没有任何额外的空格,否则会抛出以下错误:"avax.naming.NameNotFoundException: While trying to lookup"。 - Barani r

8

可能听起来很傻,但因为我遇到过这个问题,所以我想分享一下。

在Weblogic(至少10.3.4版本)下创建数据源时,不要忘记完成整个配置过程(在结束之前Finish按钮是可用的)。

在最后一页上,你可以为服务器激活数据源,而不仅仅是创建它。

要检查你的数据库是否运行正常,可以查看服务器的JNDI树。


帮助我找到了答案的关键! - Code Jockey
最糟糕的部分是我看到那个按钮在“下一个”按钮旁边,我有一种直觉,但我冷静下来说:“除了我需要定义的内容,还可能需要什么呢?”当我看到你的答案时,我就像...“是的,那就是我”。 - Ordiel
这实际上就是答案。你需要针对特定的服务器实例进行操作。 - tksilicon

3
我曾经遇到过同样的问题。我的应用程序连接到运行在本地Oracle Sql Server(Oracle XE 11g)上的Oracle DB。从其他答案中,我看到删除Weblogic缓存/tmp、/cache甚至/logs可能会起作用。我的问题是本地服务Oracle Service XE已停止。虽然这听起来很傻,但它可能有所帮助。因此,您应该执行以下三个操作: - 清除缓存; - 检查DB服务器服务是否正在运行; - 尝试重新启动WEBLOGIC服务器; 以上这些操作对我有效。

1

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”。 - raoul.nair
你想发布你的JNDI声明吗? - Scary Wombat
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"); Context ctx = new InitialContext(prop); String dsName = "java:jdbc/testDatasource"; DataSource ds=(DataSource)ctx.lookup(dsName); - raoul.nair
不,这不是JNDI声明。请查找XML文件。 - Scary Wombat
1
抱歉,我没听懂你的意思。我正在主方法中运行这个程序,请问这个 XML 文件在哪里?因为我没有创建它。 - raoul.nair
也许你需要跟创建它的人交流一下。在使用它之前,你需要确保它存在于Weblogic中。 - Scary Wombat

1
这个错误也会在weblogic中两个数据源定义了相同的JNDI名称时发生(我为测试不同的数据源属性创建了两个)。我必须删除其中一个,然后它就正常工作了。

1
我在设置生产服务器时,我的应用程序也遇到了同样的问题。
解决方法:在WebLogic控制台中定位数据源(节点或群集)。 这对我有用。
导航: 在控制台中:转到JDBC> JDBC数据源摘要> DataSource1>选择您想要部署此JDBC数据源的服务器或群集。

0

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

解决方法是,

        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 管理服务器监听的端口号。

3#. 确保以下内容已正确配置。

错误的配置: tcDataSourceContext=java:comp/env/jdbc/datasourcename

正确的配置: tcDataSourceContext=jdbc/datasourcename

4#. 还需前往 WebLogic 服务器并导航至 /Oracle/Middleware/wlserver_10.3/server/lib/,执行以下命令。

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

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

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


0
在我的情况下,是由于数据源在部署期间被销毁了。解决方案是添加 destroyMethod=""。
@Bean(name = "dataSource", destroyMethod="")
public DataSource dataSource() {

  JndiDataSourceLookup lookup = new JndiDataSourceLookup();
  return lookup.getDataSource(jndiName);

}

0
我遇到了这个异常:

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;

看起来密码错误了,但这并不一定是你的情况,因为第一个异常是通用的,可能有不同的原因,之前的回答已经解释了一些,所以我只是在补充我的。

修复密码并测试数据库连接,然后得到: enter image description here


0
我的解决方法是通过删除 C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer 中的 Temp 文件夹来清除 WebLogic 缓存。请确保在执行此操作之前停止服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接