Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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 如何通过JNDI works使用数据源?_Java_Database_Jndi - Fatal编程技术网

Java 如何通过JNDI works使用数据源?

Java 如何通过JNDI works使用数据源?,java,database,jndi,Java,Database,Jndi,在使用JNDI时,有些事情我确实不明白 这将简化Java开发人员的生活,但这一承诺听起来是错误的 从应用程序中使用数据库的最简单方法似乎是在每次需要时(因此,每个应用程序一次)构建一个数据源类,为您提供将要使用的连接或会话。 这是一个在几分钟内编写的工具类,您必须在其中声明驱动程序、url、登录名和密码。一切都结束了 推荐的方法是依靠服务器资源管理、JNDI和所有资源,如目录等。 但它真的有用且简单吗 使用Tomcat,您必须在server.xml中完整描述数据源,然后在context.xml中

在使用JNDI时,有些事情我确实不明白

这将简化Java开发人员的生活,但这一承诺听起来是错误的

从应用程序中使用数据库的最简单方法似乎是在每次需要时(因此,每个应用程序一次)构建一个数据源类,为您提供将要使用的连接或会话。 这是一个在几分钟内编写的工具类,您必须在其中声明驱动程序、url、登录名和密码。一切都结束了

推荐的方法是依靠服务器资源管理、JNDI和所有资源,如目录等。 但它真的有用且简单吗

使用Tomcat,您必须在server.xml中完整描述数据源,然后在context.xml中将其声明为资源

server.xml

<GlobalNamingResources>
   <Resource auth="Container" driverClassName="org.postgresql.Driver" maxIdle="30" maxTotal="100" maxWaitMillis="10000" name="jdbc/dsTriasEmployees" password="pwd" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/trias_employees" username="login"/>
</GlobalNamingResources>
<ResourceLink name="jdbc/dsTriasEmployees" global="jdbc/dsTriasEmployees"
        type="javax.sql.DataSource" />
<resource-ref>
      <description>
        DB PostgreSQL
      </description>
      <res-ref-name>
        jdbc/trias_employees
      </res-ref-name>
      <res-type>
        javax.sql.DataSource
      </res-type>
      <res-auth>
        Container
      </res-auth>
</resource-ref>
但在这样做之后,您仍然需要处理错误消息,这些消息告诉您这还不够,就像这样:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
我在某个地方读到,我现在应该在web.xml文件中添加一个JNDI属性文件和一个声明,如下所示:

web.xml

<GlobalNamingResources>
   <Resource auth="Container" driverClassName="org.postgresql.Driver" maxIdle="30" maxTotal="100" maxWaitMillis="10000" name="jdbc/dsTriasEmployees" password="pwd" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/trias_employees" username="login"/>
</GlobalNamingResources>
<ResourceLink name="jdbc/dsTriasEmployees" global="jdbc/dsTriasEmployees"
        type="javax.sql.DataSource" />
<resource-ref>
      <description>
        DB PostgreSQL
      </description>
      <res-ref-name>
        jdbc/trias_employees
      </res-ref-name>
      <res-type>
        javax.sql.DataSource
      </res-type>
      <res-auth>
        Container
      </res-auth>
</resource-ref>

数据库PostgreSQL
jdbc/trias_员工
javax.sql.DataSource
容器
但是当我想用jUnit进行测试时,我的web.xml是没有用的

我应该编写多少XML和属性文件,以遵守希望我将数据源访问权委托给服务器的最佳实践? 我需要复制多少次与url、池连接等相关的所有信息

我读过两三本关于JavaEE的书,50篇关于StackOverFlow的帖子,几十个论坛,以及Tomcat网站上所有的JNDI资源HOW-TO。 但它仍然不起作用

有没有关于使用JNDI进程连接到数据库所需做的一切的完整描述

请帮帮我,否则我每失去一分钟就杀一只小猫,只是为了“按推荐的方式”完成我的工作


Thanx由advance提供。

测试依赖于数据源或Tomcat通过您可以依赖的Tomcat之外的JNDI提供的任何其他对象的类。将它指向server.xml和context.xml,它将使用文件中配置的所有对象初始化JNDI环境

TomcatJNDI tomcatJNDI = new TomcatJNDI();
tomcatJNDI.processServerXml(serverXmlFile)
tomcatJNDI.processContextXml(contextXmlFile);
tomcatJNDI.start();
然后查找数据源

DataSource ds = (DataSource) InitialContext.doLookup("java:comp/env/jdbc/trias_employee")

Thanx@holger thurow