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

2022-09-02 10:19:40

我设置了以下环境:

  • Java 1.5
  • Sun 应用程序服务器 8.2
  • 甲骨文 10 XE
  • 支柱 2
  • 冬眠

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

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数据源:从Web容器外部访问数据源(通过JNDI)


答案 1

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

在本地运行使用应用程序服务器数据源的 Bean


答案 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 找到更多关于它的信息。


推荐