`
阅读更多
JNDI 是个什么东东?
2007-06-07 12:21
JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?

要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。

没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver",
true, Thread.currentThread().getContextClassLoader());
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
/* 使用conn并进行SQL操作 */
......
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {}
}
}

这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。

没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
4、......

解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

由此,就有了JNDI。

用了JNDI之后的做法:
首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。
具体操作如下(以JBoss为例):
1、配置数据源
在JBoss的 D:\jboss420GA\docs\examples\jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:\jboss420GA\server\default\deploy。
修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:
<!---->
<datasources></datasources>
<local-tx-datasource></local-tx-datasource>
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <datasources>  
  3. <local-tx-datasource>  
  4.     <jndi-name>MySqlDS</jndi-name>  
  5.     <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>  
  6.     <driver-class>com.mysql.jdbc.Driver</driver-class>  
  7.     <user-name>root</user-name>  
  8.     <password>rootpassword</password>  
  9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>  
  10.     <metadata>  
  11.        <type-mapping>mySQL</type-mapping>  
  12.     </metadata>  
  13. </local-tx-datasource>  
  14. </datasources>  

   



这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。

2、在程序中引用数据源:
Connection conn=null;
try {
Context ctx=new InitialContext();
Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源
DataSource ds=(Datasource)datasourceRef;
conn=ds.getConnection();
/* 使用conn进行数据库SQL操作 */
......
c.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) { }
}
}
直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。
在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。

由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

JNDI的扩展:
JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。

所以,在J2EE规范中,J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用(已经讨论过)、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。

EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。 外部资源”。


总结:
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而且经过一些计划和预先考虑,这个承诺是完全可以实现的。
分享到:
评论

相关推荐

    解释什么是JNDI的意义和作用

    ### 解释什么是JNDI的意义和作用 JNDI,全称为Java Naming and Directory Interface,是Sun Microsystems为Java平台提供的一套目录服务访问标准。它为应用程序提供了查找和访问命名和目录服务的统一接口,使得Java...

    jndi-1_2_1.zip_jndi_jndi-1.2.1.jar

    标题中的"jndi-1_2_1.zip_jndi_jndi-1.2.1.jar"表明这是一个关于JNDI的版本1.2.1的开源软件包,其中包含了一个名为"jndi-1.2.1.jar"的JAR文件。这个JAR文件包含了JNDI库的所有实现,使得开发者可以在他们的Java项目...

    jndi-tool JNDI服务利用工具

    "jndi-tool"是一个专门针对JNDI服务的利用工具,它可以被用来测试和利用JNDI相关的安全漏洞。此工具特别关注RMI和LDAP服务,这两种服务是JNDI常用的两种协议。RMI允许Java对象在不同的Java虚拟机之间进行远程调用,...

    jndi连接数据库配置方法

    JNDI,全称Java Naming and Directory Interface,是Java平台中的一个标准接口,它提供了一种在Java应用程序中查找和管理资源的方式。JNDI的主要目的是为了实现资源的集中管理和透明访问,使得开发者无需关心资源的...

    Tomcat中JNDI原理

    ### Tomcat中JNDI原理详解 #### 一、引言 Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API。它为开发者提供了访问各种命名和目录服务(如DNS、LDAP等)的统一接口。在Tomcat...

    JNDI数据库连接池

    在Tomcat 6.0这个流行的Java Servlet容器中,JNDI被用来配置和管理应用的数据库连接池。Tomcat支持多种数据库连接池实现,如Apache DBCP、C3P0以及HikariCP等。这些连接池通过JNDI服务注册到Tomcat的Context环境中,...

    jndi所依赖的jar包

    2. `providerutil.jar`:这个JAR文件包含了JNDI服务提供商的实用工具类,这些类帮助实现和管理服务提供商,使它们能够被JNDI框架识别和使用。服务提供商是JNDI的核心组成部分,它们提供了实际的命名和目录服务实现。...

    JNDIDemo 以及相关文档

    9. **JNDIDemo**:提供的`JNDIDemo`可能是一个示例程序,展示了如何使用JNDI进行查找、绑定等操作。通过查看源代码和运行示例,可以深入理解JNDI的工作原理。 10. **学习资料**:提供的文档,如`java的JNDI 技术...

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all

    该压缩包"JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar"可能包含了一个JNDI注入攻击的示例或者测试工具,"SNAPSHOT"通常表示这是一个开发中的版本,可能尚未经过完整测试,因此可能存在漏洞或不稳定性。使用这样的...

    JNDI简单应用示例

    这个"JNDI简单应用示例"可能是演示如何使用JNDI进行基本操作的代码实例,例如: 1. **初始化Naming Context**:首先,你需要创建一个初始上下文(InitialContext),这是所有JNDI操作的起点。这通常通过传递一个...

    java jndi的使用

    JNDI的核心概念是提供一个统一的接口来管理应用程序中的命名和目录服务,使得应用可以独立于具体的命名或目录服务提供商。 在Java应用中,JNDI通常与Java EE服务器结合使用,用于管理数据源。例如,通过JNDI,我们...

    JNDI学习文档.doc

    JNDI支持属性,这意味着每个条目都可以拥有多个键值对,便于根据特定属性查询和过滤资源。例如,一个目录服务可能包含多个数据库连接配置,每个配置都有自己的URL、用户名和密码等属性。 **3. 上下文(Context)** ...

    用JNDI绑定DataSource

    在实际应用中,一旦数据源被绑定到JNDI,其他部分的代码可以通过JNDI查找机制来获取并使用这个数据源。这通常涉及以下步骤:首先,创建一个新的`InitialContext`实例,然后调用`lookup()`方法,传入之前绑定的数据...

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip

    标题"JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip"暗示了这是一个关于JNDI注入漏洞的exploit工具包,版本为1.0 SNAPSHOT,可能包含了多个利用示例或攻击代码。"all"可能表示该压缩包包含了所有相关的组件或测试...

    jndi数据库查询例子

    下面我们将深入探讨JNDI数据库查询的基本概念、工作原理以及如何在MyEclipse环境中实现一个简单的查询示例。 **1. JNDI基础知识** JNDI的核心概念包括命名空间、上下文(Context)和查找操作。命名空间是一个组织...

    jndi连接池帮助文档

    2. **为什么要使用JNDI**: 主要是为了解决多应用程序共享资源的问题。比如,多个Web应用可能都需要连接到同一数据库,如果每个应用都单独创建和管理数据库连接,将会造成资源浪费,增加系统开销。通过JNDI,可以将...

    JNDI示例整合SSH

    提供的`SSHJNDI.rar`可能包含一个示例项目的源代码,供学习和参考。`readme.txt`文件则可能包含项目的简要介绍或使用说明,帮助理解代码结构和运行方法。为了深入学习和实践,你可以解压并研究这些文件,结合文章...

    jndi-1.2.1.jar.zip

    JNDI 1.2.1是这个接口的一个版本,它在JNDI 1.2的基础上进行了优化和增强,以满足开发者对于更高效、更稳定的服务需求。本文将深入探讨JNDI 1.2.1的核心概念、功能以及它在实际应用中的重要性。 JNDI的主要目标是...

    jndi-JNDI-Injection-Exploit

    java asm jndi_JNDI-Injection-Exploit,用于log4j2漏洞验证 可执行程序为jar包,在命令行中运行以下命令: $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] 其中: -C ...

Global site tag (gtag.js) - Google Analytics