如何通过JNDI使用DataSource?

时间:2016-12-08 11:07:02

标签: java database jndi

使用 JNDI 时,我绝对不理解

这应该简化我们的Java开发人员和#39;生活,但这个承诺听起来是假的。

最简单的方法 tu在应用程序中使用数据库似乎每次需要时构建(因此,每个应用程序一次)一个数据源类,为您提供连接或者您将使用的会话。 它是几分钟内编写的工具类,您必须声明驱动程序,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>

context.xml中

<ResourceLink name="jdbc/dsTriasEmployees" global="jdbc/dsTriasEmployees"
        type="javax.sql.DataSource" />

Java方面,你应该能够通过一个@Resource(mappedBy ...)注释的Context Lookup代码来注入它。

DataSource datasource;

    public Connection connectJNDI() {
        try {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:/comp/env");
            datasource = (DataSource) envContext.lookup("jdbc/trias_employees");
            Connection con = datasource.getConnection();
            genericLogger.info("JNDI LOOKUP -> " + con);
            return con;
        } catch (Exception ex) {
            genericLogger.error("JNDI LOOKUP -> " + ex);

        return null;
    }

但在这样做之后,你仍然需要处理错误消息,告诉你它不够像这样:

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

<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>

但是当我想用jUnit进行测试时,我的web.xml没有用...

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

我已经阅读了2或3本关于Java EE的书籍,StackOverFlow上的50篇帖子以及Tomcat网站上的数十个论坛和所有JNDI资源HOW-TO。 但它仍然不起作用......

是否存在使用JNDI进程连接数据库所需的全部描述?

请帮助我,或者我每隔一分钟就会杀死一只小猫我只是为了完成我的工作而失去了...#34;推荐的方式&#34;。

提前完成。

1 个答案:

答案 0 :(得分:1)

要测试依赖于数据源的类或Tomcat通过Tomcat之外的JNDI提供的任何其他对象,您可以依赖TomcatJNDI。将它指向您的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")

You can find out more about TomcatJNDI here.