JNDI详解
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数据库,如下:
上面的解释中提高了命名服务和目录服务两个概念.先要了解JNDI就必须知道,命名服务和目录服务是做什么用的。
学习新的概念和知识,比较有效的方式是通过和以前所学过的内容进行联系,比较。
关于命名服务,其实我们很多时候都在用它,但是并不知道它是它,比较典型的是域名服务器DNS(Domain Naming Service),大对人对DNS还是比较了解的,它是将域名映射到IP地址的服务.比如百度的域名www.baidu.com所映射的IP地址是http://202.108.22.5/,你在浏览器中输入两个内容是到的同一个页面.用命名服务器的原因是因为我们记忆baidu这几个有意义的字母要比记202.108.22.5更容易记忆,但如果站到计算机的角度上,它更喜欢处理这些数字。
从我们生活中找的话还有很多类似的例子,比如说你的身份证号和你的名字可以"理解"成一种命名服务,你的学号和姓名也可以"解释"为一种命名服务。
可以看出命名服务的特点:一个值和另一个值的映射,将我们人类更容易认识的值同计算机更容易认识的值进行一一映射。
到现在应该对命名服务有所理解吧?
至于目录服务,从计算机角度理解为在互联网上有着各种各样的资源和主机,但是这些内容都是散落在互联网中,为了访问这些散落的资源并获得相应的服务,就需要用到目录服务。
从我们日常生活中去理解目录服务的概念可以从电话簿说起,电话簿本身就是一个比较典型的目录服务,如果你要找到某个人的电话号码,你需要从电话簿里找到这个人的名称,然后再看其电话号码。
理解了命名服务和目录服务再回过头来看JDNI,它是一个为Java应用程序提供命名服务的应用程序接口,为我们提供了查找和访问各种命名和目录服务的通用统一的接口.通过JNDI统一接口我们可以来访问各种不同类型的服务.如下图所示,我们可以通过JNDI API来访问刚才谈到的DNS。
至此已经对JNDI有了一个初步认识,如果想要进一步了解JNDI,并对使用JDNI给我们带来哪些便利之处,我推荐两篇关于JDNI的文章,写的非常的好,两篇文章从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个角度来加深对JNDI的认识。
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