JNDI解读(转)

NDI 是什么

JNDI是 Java 命名暨目录接口(Java Naming and Directory
Interface),在J2EE规范中凡最主要之正规之一,不少师认为,没有透彻理解JNDI的义与用意,就从未有过真正主宰J2EE特别是EJB的知识。

那么,JNDI到底起什么作用?

假设了解JNDI的打算,我们可起“如果不用JNDI我们哪做?用了JNDI后我们又拿如何做?”这个题目来探讨。

没有JNDI的做法:

程序员开发时,知道如果开访问MySQL数据库的运,于是将一个针对 MySQL JDBC
驱动程序类的援进行了编码,并由此以方便的 JDBC URL 连接到数据库。
便比如以下代码这样:

  1. Connection conn=null;  
  2. try {  
  3. Class.forName(“com.mysql.jdbc.Driver”,  
  4. true, Thread.currentThread().getContextClassLoader());
     
  5. conn=DriverManager.getConnection(“jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue”);
     
  6. /* 使用conn并进行SQL操作 */ 
  7. ……  
  8. conn.close();  
  9. }   
  10. catch(Exception e) {  
  11. e.printStackTrace();  
  12. }   
  13. finally {  
  14. if(conn!=null) {
     
  15. try {  
  16. conn.close();  
  17. } catch(SQLException e) {}  
  18. }  

旋即是传统的做法,也是以前非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数据库,如下:

  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、在先后中引用数据源:

  1. Connection conn=null;  
  2. try {  
  3. Context ctx=new InitialContext();  
  4. Object datasourceRef=ctx.lookup(“java:MySqlDS”); //引用数据源  
  5. DataSource ds=(Datasource)datasourceRef;  
  6. conn=ds.getConnection();  
  7. /* 使用conn进行数据库SQL操作 */ 
  8. ……  
  9. c.close();  
  10. }   
  11. catch(Exception e) {  
  12. e.printStackTrace();  
  13. }   
  14. finally {  
  15. if(conn!=null) {
     
  16. try {  
  17. conn.close();  
  18. } catch(SQLException e) { }  
  19. }  

直接以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 的允诺,而且经过一些计划跟预先考虑,这个承诺是全然好兑现之。

不久前直以对J2EE的记进行整治及习,虽然J2EE视频是圈罢同样整整了,但是当自身看自己做的笔记的时光陌生程度还是特别怪,而真的对某概念有认识的下是将记和原先看了的视频印象进行摩擦,J2EE主要教学的情节是逐一专业,再了解部分不怕是各个概念,现阶段之目标并无是左右J2EE,而是对J2EE进行轮廓与概念上的了解及认识,到下一致步DRP项目遭到还特别层次的针对性一一专业开展摩擦和认得。

JNDI,翻译为Java命名和目录结构(JavaNaming And Directory
Interface)官方对那解说啊JNDI是如出一辙组在Java应用被走访命名暨目录服务之API(ApplicationProgramming
Interface)说明很粗略,但是比空虚。

点的说明着增长了命名服务和目录服务少只概念.先使了解JNDI就不能不掌握,命名服务与目录服务是做什么用的。

学新的定义和知识,比较实用的方是经与原先所学过的内容展开关联,比较。

至于命名服务,其实我们多时节都于于是她,但是并不知道它是其,比较典型的是域名服务器DNS(Domain
Naming
Service),大对人口对DNS还是比较了解之,它是将域名映射到IP地址的服务.比如百度的域名www.baidu.com所投的IP地址是http://202.108.22.5/,你以浏览器中输入两单内容是到的同一个页面.之所以命名服务器的故是为我们记忆baidu这几个发意义之假名要比记202.108.22.5再度易于记忆,但若是站至电脑的角度达,它再也爱好处理这些数字。

打咱生存备受找找的语句还闹不少像样之例证,比如说你的身份证号和您的名可以”理解”成一种命名服务,你的学号和人名也得”解释”为同种命名服务。

好望命名服务之表征:一个价与另一个值的照射,将我们人类还易认识的价值和计算机更爱认识的值进行逐个映射。

到现该针对命名服务具有知吧?

有关目录服务,从计算机角度理解为于互联网及保有形形色色的资源以及主机,但是这些情节都是散在互联网遭受,为了看这些散落的资源并取得相应的服务,就得为此到目服务。

图片 1

于我们日常生活中去领略目录服务之概念好打电话簿说于,电话簿本身就是是一个比较典型的目服务,如果你一旦找到有人之电话号码,你用由电话簿里找到这个人口的名号,然后再度看那电话号码。

图片 2 

明白了命名服务及目录服务更回过头来看JDNI,它是一个为Java应用程序提供命名服务之应用程序接口,为我们提供了搜索和走访各种命名暨目录服务的通用统一的接口.通过JNDI统一接口我们可来拜访各种不同种类的服务.如下图所展示,我们得以经过JNDI
API来访问刚才讲到的DNS。

图片 3

从那之后已针对性JNDI有矣一个开识,如果想如果逾询问JNDI,并对准下JDNI给咱们带来什么样便利的处,我推荐两篇有关JDNI的稿子,写的要命的好,两篇稿子从“如果非用JNDI我们怎么样做?用了JNDI后我们同时将什么做?”这个角度来深化对JNDI的认。

相关文章