如何从 Web 容器外部查找 JNDI 数据源?

Posted

技术标签:

【中文标题】如何从 Web 容器外部查找 JNDI 数据源?【英文标题】:How do I lookup a JNDI Datasource from outside a web container? 【发布时间】:2011-02-01 01:27:35 【问题描述】:

我设置了以下环境:

Java 1.5 Sun 应用服务器 8.2 Oracle 10 XE 支柱 2 休眠

我很想知道如何为可以引用应用服务器提供的 JNDI 数据源的 Java 客户端(即 Web 应用程序之外)编写代码。

Sun 应用服务器的端口都是默认的。在服务器配置中有一个名为 jdbc/xxxx 的 JNDI 数据源,但我注意到 Web 应用程序的 Hibernate 配置使用名称 java:comp/env/jdbc/xxxx。

到目前为止,我看到的大多数示例都涉及类似

的代码
Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");

但似乎我使用了错误的 JNDI 名称,或者我需要配置 jndi.properties 或其他配置文件以正确指向侦听器?我有来自 Sun Application Server 的 appserv-rt.jar,其中有一个 jndi.properties,但它似乎没有帮助。

这里有一个类似的问题,但是没有给出任何代码/指的是让iBatis自动获取JNDI数据源:Accessing Datasource from Outside A Web Container (through JNDI)

【问题讨论】:

【参考方案1】:

我陷入了同样的问题。我写了一个小教程。基本上,您必须创建自己的 DataSource 对象实现并将它们添加到您自己的自定义初始上下文中。这里有源示例:

Running Beans Locally that use Application Server Data Sources

【讨论】:

这篇博文非常有用。谢谢!【参考方案2】:

试试 Simple-JNDI。它为您提供了 JNDI 服务的内存实现,并允许您使用属性文件中定义的对象填充 JNDI 环境。还支持加载文件中配置的数据源或连接池。

要获得连接池,您必须创建如下文件:

type=javax.sql.DataSource
driver=com.sybase.jdbc3.jdbc.SybDriver
pool=myDataSource
url=jdbc:sybase:Tds:servername:5000
user=user
password=password

在您的应用程序中,您可以通过以下方式访问池

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

多年来,我一直为此目的使用 Simple-JNDI。但它不再处于积极开发中。因为我发现了一些关于共享上下文的问题(尤其是使用数据源),所以我决定分支原始项目并添加一些新功能。现在有一个 0.13.0。您可以在https://github.com/h-thurow/Simple-JNDI 找到更多相关信息。

【讨论】:

【参考方案3】:

如果您每天都在谈论一些在容器外运行的通用 Java 应用程序,那么您就不走运了。实际上,您需要使用自己的配置连接池等配置自己的 JNDI 实现。

但是,您可以编写 Java EE“独立”应用程序。这些是在 Java EE 应用程序客户端中运行的应用程序。基本上,它是一个部署和打包的应用程序,然后使用 Java EE 容器提供的启动器执行。

在应用程序客户端环境中运行时,应用程序服务器的所有资源(连接池、EJB、队列等)都可供您的应用程序使用,就像代码部署在应用程序服务器中一样。

Here 是 Sun App Server 8.2 的一些教程文档,它是一个 J2EE 1.4 容器。

如果可能的话,我强烈建议升级到 Glassfish v2.1,它只是一个更现代、更好的服务器,应该可以正常部署您的应用程序,因为它是 8.2 的后代。

【讨论】:

感谢您编写独立 JEE 应用程序的想法。这是一个有趣的替代方案,但我希望可以使用应用程序服务器作为直接 JNDI 提供程序来直接获取远程数据源。不幸的是,选择 Sun App Server 8.2 是由于遗留原因,所以我们不能转向 Glassfish,这肯定会更好。【参考方案4】:

这对你来说可能有点晚了,但我多年来一直使用Simple-JNDI library 来实现你提到的确切目的。我不确定它是否具有您可能需要的所有选项,但对于我的命令行实用程序来说已经足够了。

【讨论】:

【参考方案5】:

你想要的是Application Client

或者,您可以从独立客户端建立一个普通的 JDBC 连接,这可能更容易创建 - 但您必须在客户端中配置连接详细信息,并且不能重用应用服务器中的设置。

【讨论】:

您好,感谢您的回复。应用程序客户端很有趣,但它对我的需求来说有点太重了。目的是重用网络服务器中定义的连接,以保持一致性,作为单点获取数据库连接。

以上是关于如何从 Web 容器外部查找 JNDI 数据源?的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat配置JNDI

如何在使用 JNDI 的应用程序中查找数据源 [重复]

在 Spring Boot 应用程序中查找 JNDI 数据源失败

如何访问 weblogic 10.3.6 中定义的 JNDI 数据源

JNDI是什么?

如何在 Coherence 12.2.1 中启用缓存服务器 JNDI 查找支持?