【问题标题】:How to make use of a DataSource via JNDI works?如何通过 JNDI 使用 DataSource?
【发布时间】:2016-12-08 11:07:01
【问题描述】:

在使用 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>

context.xml

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

Java 方面,由于上下文查找代码或 @Resource(mappedBy...) 注释,您应该能够注入它。

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 的书籍、50 篇关于 StackOverFlow 的帖子以及数十个论坛以及 Tomcat 网站上的所有 JNDI 资源 HOW-TO。 但是还是不行……

在某处是否有完整的描述我必须使用 JNDI 进程连接到我的数据库?

请帮帮我,否则我会在我失去的每一分钟内杀死一只小猫,只是为了以“推荐的方式”完成我的工作。

提前致谢。

【问题讨论】:

    标签: java database jndi


    【解决方案1】:

    要测试依赖于 DataSource 的类或 Tomcat 通过 JNDI 在 Tomcat 之外提供的任何其他对象,您可以依赖 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.

    【讨论】:

    • 感谢@holger-thurow
    猜你喜欢
    • 2012-02-29
    • 2015-03-18
    • 2015-12-11
    • 2016-05-01
    • 2010-10-01
    • 2013-06-30
    • 1970-01-01
    • 2015-09-11
    • 2011-05-03
    相关资源
    最近更新 更多