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

时间:2010-03-26 06:14:57

标签: java jdbc datasource jndi

我设置了以下环境:

  • Java 1.5
  • Sun Application Server 8.2
  • Oracle 10 XE
  • Struts 2
  • 休眠

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

Sun Application Server的端口都是默认端口。服务器配置中有一个名为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)

5 个答案:

答案 0 :(得分:17)

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

Running Beans Locally that use Application Server Data Sources

答案 1 :(得分: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找到更多相关信息。

答案 2 :(得分:1)

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

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

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

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

如果有可能我强烈建议升级到Glassfish v2.1,只是一个更现代,更好的全方位服务器,应该按原样部署你的应用程序,因为它是8.2的后代。

答案 3 :(得分:0)

你想要的是Application Client

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

答案 4 :(得分:0)

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

相关问题