JNDI简介

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统

接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API

映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。这些官方的话

想我这样的java菜鸟是理解不了的,那么下面我就给大家简单的明了的说一下;

如果我们想弄明白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

之前我们如果想要访问MySql数据库或者是SQL数据库的时候,我们需要将一个对MySQL驱动程序类的引用进行了

编码,并通过使用适当的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) {}
}
} 

这是传统的做法,也是之前我们常用的做法,这种做法一般在小规模的开发过程中不会产生问题。但是这样做还是

会存在比较多的问题;

1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

对于程序员开发中面临的这些问题,我们应该如何来解决?

作为开发的程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC url格式是什么?

访问数控的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对JDBC的引用,没有服务器名称,没

有用户名和口令,甚至没有对数据库池和连接管理,而这些问题都较为J2EE的容器来配置和管理,因此,就有了我们

的JNDI.

当我们有了JNDI以后,我们首先在j2ee的容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这

个数据源引用参数,给这个数据源设置一个名称,然后在程序中,通过数据源名称引用数据源从而访问后台数据库。

1、配置数据源

在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其

中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。

修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

修改 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、在程序中引用数据源

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避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

小结

J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” ——

J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充

当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展

(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接

层,这样组件就可以发现所需要的资源,而不用了解这些间接性。在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起

的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺,而

且经过一些计划和预先考虑,这个承诺是完全可以实现的。

JAVA菜鸟成长记——JNDI相关推荐

  1. java入门学习总结——【java菜鸟成长记】

    引言    经过一周左右的时间学习完了java的入门知识--j2se视频教程,小编也是算是进入java领域的一个小菜鸟了, 从很早就知道java这行的水很深,从就业方面来看也大多是java高级工程师, ...

  2. J2EE的经常使用十三规范——java菜鸟成长记

    引言 通过这一段时间的学习,美其名曰是看完了j2ee的学习视频.然而并没有什么卵用,视频中将的都是个什么东西 啊.反正我是没有看明确,无奈,仅仅能是一边看视频,一边看书,一边百度,事实上起到作用最大的 ...

  3. 编码 GBK 的不可映射字符——【java菜鸟成长记】

    最近在学习一些java的入门知识,当然在学习的时候就少不了敲一些小例子,在敲小例子的时候都是用txt文本敲 的,没有采用成熟的编译器,因为这样更有利于我们对一些基础语法的掌握,也可以见到一些错误,这样 ...

  4. Android菜鸟成长记4-button点击事件

    Button 1.button按钮的创建 一般来说,在我们新建一个Android项目的时候,会有会默认有一个activity_main.xml的文件 如果你在新建项目的时候,把Create Activ ...

  5. 菜鸟成长记(十一)----- 操蛋的2016与未知的2017

    现在已经2017.1.16号了,早就说着要写篇总结,骂骂特么操蛋的自己,当然这两三年来在这里骂的真特么不在少数了,但是都是特么一拖再拖,刚刚明明是在看TPO阅读的,但是特么实在是无法集中精神的看,作罢 ...

  6. Android菜鸟成长记1--环境的搭配和第一个项目的构建

    一.配置Android环境 1.下载JavaJDK的本地,然后拷贝出来(因为Android实在java的基础上开发的,所以要先配置java环境) 2.java环境变量的配置 配置方法(我的电脑上-&g ...

  7. 黑马程序员——JAVA菜鸟修炼记之天下大势:Java体系鸟瞰

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  8. 数据库 | 菜鸟成长记之MySQL数据库

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  9. 菜鸟成长记----做一个简易的搜索引擎

    上一次小白已经得到了一个任劳任怨的网络小爬虫,要是不搞一波小事情似乎对不太起这个小爬虫,于是乎小白又鼓捣鼓捣参考各方大神的资料以倒排索引为基础原理设计了一个简答的搜索引擎. 之前的爬虫只是得到了网页的 ...

最新文章

  1. 假期怎么提升Python技能?100+编程题给你练~
  2. MMD_1a_MapReduce
  3. 浏览器端JS导出EXCEL
  4. 河马php一句话木马,一句话木马的套路
  5. 黑马Python + 人工智能学习笔记
  6. php xml 空格,php闭合标签输出多余空行使xml页面显示错误的处理
  7. Java变量的初始化问题探究
  8. SonarQube 7.7默认数据库连接方法
  9. web项目目录访问 路径
  10. 浅谈暴力破解及验证码安全
  11. p1口实验_「正点原子NANO STM32开发板资料连载」第二章 实验硬件资源详解
  12. 德语课堂笔记 之 与食物相关的名词
  13. python gpio 接口_树莓派python中gpio库有哪些
  14. 3dmax文件格式转换——.max 转换为 .flt(解决转换后.flt没有纹理贴图的问题)
  15. CentOs6.5 详细安装步骤
  16. 指针:const与指针
  17. “读心术”或将代替传统密码:EEG识别脑电波,以此来鉴别身份
  18. AT8236控制代码
  19. 题解 P1985 【[USACO07OPEN]翻转棋】
  20. 获得手机IMEI IMSI

热门文章

  1. css文本换行以及出现省略号简单处理
  2. 财税行业拓客的10个经典方法
  3. CSS栅格布局(Grid)
  4. 非科班双非本科投的337家Java后台(励志)
  5. 完美解决WIN7使用农行K宝和支付宝问题
  6. 公众号加音频文件的实现方案
  7. ——苹果AppStore被拒理由大全
  8. xy苹果助手未受信任_苹果试图关闭iOS12.4系统,要越狱请赶紧
  9. Unity切换到另一个场景的时候,发现该场景变暗了
  10. 华文慕课Java程序设计笔记