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

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

在本地运行使用Application Server数据源的Bean

试试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。 但它不再处于积极发展之中。 因为我发现了一些有关共享上下文的问题(特别是使用数据源),所以我决定分支原始项目并添加一些新function。 现在有一个0.13.0。 您可以在https://github.com/h-thurow/Simple-JNDI找到更多相关信息。

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

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

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

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

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

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

你想要的是一个应用程序客户端

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