【发布时间】: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 进程连接到我的数据库?
请帮帮我,否则我会在我失去的每一分钟内杀死一只小猫,只是为了以“推荐的方式”完成我的工作。
提前致谢。
【问题讨论】: