Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从web容器外部查找JNDI数据源?_Java_Jdbc_Datasource_Jndi - Fatal编程技术网

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

Java 如何从web容器外部查找JNDI数据源?,java,jdbc,datasource,jndi,Java,Jdbc,Datasource,Jndi,我已设置以下环境: Java 1.5 Sun应用服务器8.2 甲骨文10XE 支柱2 冬眠 我想知道如何为Java客户机(即web应用程序外部)编写代码,该客户机可以引用应用程序服务器提供的JNDI数据源 Sun Application Server的端口都是默认端口。服务器配置中有一个名为jdbc/xxxx的JNDI数据源,但我注意到web应用程序的Hibernate配置使用了java:comp/env/jdbc/xxxx 到目前为止,我看到的大多数示例都涉及如下代码 Context ct

我已设置以下环境:

  • Java 1.5
  • Sun应用服务器8.2
  • 甲骨文10XE
  • 支柱2
  • 冬眠
我想知道如何为Java客户机(即web应用程序外部)编写代码,该客户机可以引用应用程序服务器提供的JNDI数据源

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应用服务器获得了appserv-rt.jar,其中包含一个jndi.properties,但它似乎没有帮助


这里有一个类似的问题,但它没有给出任何代码/指让iBatis自动获取JNDI数据源:

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

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

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

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

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

您需要的是


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

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


这对您来说可能有点晚了,但我多年来一直在使用这个选项,以实现您提到的确切目的。我不确定它是否具有您可能需要的所有选项,但它足以满足我的命令行实用程序

试试简单的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");

多年来,我一直使用简单的JNDI来实现这一目的。但它不再处于积极发展之中。因为我发现了一些关于共享上下文(特别是使用数据源)的问题,所以我决定对原始项目进行分支,并添加一些新特性。现在是0.13.0。您可以在上找到更多信息。

您好,谢谢您的回复。应用程序客户端很有趣,但对于我的需求来说,它有点太重了。其目的是重用web服务器中定义的连接,以保持一致性,作为获得数据库连接的单点。感谢您提出编写独立JEE应用程序的想法。这是一个有趣的替代方案,但我希望有可能使用AppServer作为直接JNDI提供者来直接获取远程数据源。不幸的是,选择Sun App Server 8.2是因为遗留的原因,所以我们不能转向Glassfish,这肯定会更好。这篇博文非常有用。谢谢