JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?
要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。
没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Java code
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.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数据库,如下:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS </jndi-name>
<connection-url>jdbc:mysql://localhost:3306/lw </connection-url>
<driver-class>com.mysql.jdbc.Driver </driver-class>
<user-name>root </user-name>
<password>rootpassword </password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </exception-sorter-class-name>
<metadata>
<type-mapping>mySQL </type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。
2、在程序中引用数据源:
Java code
Connection conn=null; try { Context ctx=new InitialContext(); Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源 DataSource ds=(Datasource)datasourceRef; conn=ds.getConnection(); ...... 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,全称为Java Naming and Directory Interface,是Sun Microsystems为Java平台提供的一套目录服务访问标准。它为应用程序提供了查找和访问命名和目录服务的统一接口,使得Java...
下面将详细解释配置JNDI数据源的相关知识点。 一、JNDI数据源的概念 JNDI数据源是一种在JNDI上下文中注册的数据库连接池对象,它提供了一种在多个应用之间共享数据库连接的方法。这样,每个应用都可以通过JNDI查找...
**JNDI(Java Naming and Directory Interface)...如果你想要进一步深入,可以参考提供的博客链接:[https://canofy.iteye.com/blog/613841](https://canofy.iteye.com/blog/613841),那里可能有更详尽的实例和解释。
- **README**:项目说明文档,解释如何编译、运行和理解项目内容。 **学习JNDI的关键点**: 1. **理解Naming和Directory的区别**:Naming服务主要是用来管理简单的名字到对象的映射,而Directory服务则可以存储和...
本文将对 Tomcat 6.0 中的 JNDI 连接 MySQL 实例进行详细的介绍和解释。 配置 JNDI 资源 在 Tomcat 6.0 中,需要在 `META-INF/context.xml` 文件中配置 JNDI 资源。下面是一个基本的配置示例: ```xml type=...
3. "Readme.txt" - 通常包含对压缩包内容的简短说明或指南,可能解释了如何理解和使用提供的配置文件。 4. "server.xml" - 这是Tomcat的主要配置文件,包含了服务器的行为和组件配置,包括JNDI和SSL的相关设置。 5. ...
### 走出 JNDI 迷宫 #### 关键知识点概述 本文旨在解决Java开发者在使用Java Naming and Directory Interface (JNDI)时遇到的问题,特别是那些涉及到EJB(Enterprise JavaBeans)组件查找和访问的过程。对于刚接触...
在博客文章"**http://blog.csdn.net/icecream0/article/details/7084992**"中,作者可能详细解释了如何创建EJB Bean、配置JNDI以及编写客户端代码来调用这些Bean。这个例子可以帮助初学者理解EJB的工作原理,以及...
2. **资源创建**:解释如何通过工具添加新的JNDI资源,如数据源、邮件会话等。 3. **配置参数**:描述每个资源的可配置参数,如数据库连接的URL、用户名、密码等。 4. **绑定到应用**:说明如何将配置好的资源绑定到...
解释:可以通过JNDI(Java Naming and Directory Interface)来取得数据源。 10. 会话是。(选择 1 项) 答:客户机和 Web 服务器之间的一组交互 解释:会话是指客户机和Web服务器之间的一组交互。 11. 客户端状态...
在"jndi指南.zip"这个压缩包中,我们可以找到一些关键文件,它们可能是用来解释和示例JNDI用法的文档和资源: 1. **TOC.html** - 这通常是Table of Contents(目录),列出压缩包内所有文件的结构和内容,帮助用户...
2. **Spring JMS配置**:接着,作者可能详细解释如何在Spring应用中配置JMS,包括设置ConnectionFactory、Destination(队列或主题)以及MessageListener容器。 3. **JNDI配置**:这部分将详细阐述如何在应用服务器...
通常,这样的“资料”可能包括PDF文档、源代码文件、配置示例等,用于解释和展示Tomcat JNDI的各个方面。 现在,让我们深入探讨一下Tomcat JNDI的知识点: 1. **JNDI基本概念**:JNDI是Java平台的一个核心部分,它...
本文将深入探讨EJB中JNDI的使用,并通过源码示例来解释其工作原理。 1. JNDI基础知识 JNDI的核心概念是命名和目录服务。它提供了一个统一的接口来访问不同的命名和目录系统,如DNS、LDAP等。在EJB上下文中,JNDI...
### Tomcat 5.5 JNDI 配置详解 #### 一、概述 在Java Web应用开发过程中,经常需要连接数据库以实现数据交互。为了更好地管理这些资源,Tomcat等应用服务器提供了JNDI(Java Naming and Directory Interface)服务...
下面将详细解释标题和描述中提及的九个关键术语。 1. **JMS(Java Message Service)** JMS是Java平台中用于在分布式环境中进行异步消息传递的标准API。它允许应用程序创建、发送、接收和读取消息,提供了消息队列...
这个文件可能包含了示例代码、配置文件或者解释性的文档,帮助开发者理解如何在实际项目中应用这一特性。 总之,File System Service Provider扩展了JNDI的功能,使得开发者能够以统一的方式处理文件系统操作,增强...
其中包括可能的Java测试类、配置文件(如ldap.conf)、示例数据文件以及README文档,解释如何运行测试和期望的结果。 - 解压并导入到开发环境中,按照README的指示编译和运行测试,可以更好地理解和学习OpenLDAP与...
本文将详细解释JNDI是什么,JNDI攻击的工作原理,以及如何通过了解这个压缩包来提高我们的系统安全性。 首先,JNDI是Java平台提供的一种服务,它允许Java应用程序通过统一的方式访问各种命名和目录服务,如DNS、...
在文档“JNDI 在 J2EE 中的角色.docx”中,可能会详细解释JNDI的原理、工作流程、如何在实际项目中使用JNDI以及最佳实践。阅读这篇文档将有助于深入理解JNDI在构建大型、分布式J2EE系统中的核心价值。通过学习和掌握...