JNDI知识总结

最近在理解公司一个项目的框架的过程中,再一次遇到了JNDI。虽然概念并不难理解,名字和目录服务,但总感觉不是自己写的东西,使用起来有些怪怪地感觉。今天用一个上午再次翻箱倒柜地在网上查资料,终于自我感觉有了一个还算可以地理解,当然,代码我依然没有看到。闲话少说,上菜!

Context简介   名字服务是用来映射一个名字和一个对象。一个名字和一个对象之间的映射称之为绑定(binding).许多绑定的一个集合称之为context(上下文)。一个context可以被bind到另一个context上,这个被bind的context称之为subcontext。这个类就是JNDI的灵魂所在。   JNDI用javax.naming.Context接口在命名系统中来表示context。它是与命名服务交互的关键接口。一个Context知道这个命名系统的所有映射关系,但还有一点区别。你或许试图将其作为java.io.File对象来思考,但不一样。Context不提供真实的路径,它只是一个对象与一个逻辑名的映射,这个逻辑名不代表任何意义。

InitialContext Class   javax.naming.InitialContext实现了Context接口。使用JNDI来从一个命名系统中获得对象,必须首先创建InitialContext对象。InitialContext的构造函数需要一些属性,如java.util.Hashtable或者它的子类之一如Properties对象。 示例代码如下:   Properties props = new Properties();   props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");   props.put(Context.PROVIDER_URL, "file:///");   //从刚才创建的properties中创建初使的context   Context initialContext = new InitialContext(props);   最基本的属性的关键字是java.naming.factory.initial,它对应着常量Context.INITAL_CONTEXT_FACTORY。这个属性的值指定要使用的初使化上下文工厂的环境属性名称。这个工厂类的工作是产生合适的InitialContext以提供服务为我们抛回对象。我们必须为这个工厂类提供它创建InitialContext类需要的所有信息。例如,工厂类通过Context.PROVIED_URL属性,可以知道协议类型,服务名,和使用的路径。   文件系统工厂类(com.sun.jndi.fscontext.RefFSContextFactory)不需要更多的信息。其它工厂类,如Sun的LDAP服务提供者可能还需要用户名和密码,   部分内容翻译自http://www.unix.com.ua/orelly/java-ent/jenut/ch06_03.htm,如果不够明白,请参看原文。

因为代码中有个Properties的类,顺便介绍。   Properties简介     Properties用来保存一组属性名和值,它的作用跟哈希表差不多。不过它保存的属性的名和值都是String类型,并且对象可以保存到流当中或者从流当中读取。

Tomcat的JNDI数据源配置   说到JNDI就不得不提一下DataSource。与JDBC1.0中的DriverManager相比,DataSource对数据库的访问控制更加高效,简洁,而且支持连接池。所有的与数据库相关的信息都做为DataSource的属性,而DataSource的属性可以由管理员来进行配置,没有必要硬编码到代码中。可以在Tomcat中使用JNDI服务来为DataSource作注册一个逻辑名称,然后就可以在程序中进行引用而获得连接了。关于连接的细节完全不需要用户进行考虑。

JNDI数据源在Tomcat中的配置   需要配置web.xml文件和server.xml文件。   例子如下:

A.在server.xml中加入<Resource>元素:<Resource>元素用来定义JNDI Resource。    属性 描述 name 指定Resource的JNDI名字 auth 指定管理Resource的Manager,它有两个可选值:Container、Application type 指定Resource所属的Java类名

<Resource name = "jdbc/BookDb"  auth = "Container"     type = "javax.sql.DataSource" />

B.在<Resource>元素中加入<ResourceParams>元素:<ResourceParams>元素用来指定各种参数值    属性 描述 factory 指定生成的DataResource的factory类名 maxActive 指定数据库连接池中处于活动状态的最大连接数目,0表示不受限制 maxIdle 指定数据库连接池中处于空闲状态的最大连接数目,0表示不受限制 maxWait 指定连接池中连接处于空闲状态的最长时间,超过会抛出异常,-1表示无限 username 指定连接数据库的用户名 password 指定连接数据库的口令 driverClassName 指定连接数据库的JDBC驱动程序 url 指定连接数据库的URL

<ResourceParams name = "jdbc/BookDb">

<parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter>

<parameter> <name>maxActive</name> <value>100</value> </parameter>

<parameter> <name>maxIdle</name> <value>30</value> </parameter>

<parameter> <name>maxWait</name> <value>10000</value> </parameter>

<parameter> <name>username</name> <value>user</value> </parameter>

<parameter> <name>password</name> <value>1234</value> </parameter>

<parameter> <name>driverClassName</name> <value>com.mysql.jdbc.Driver</value> </parameter>

<parameter> <name>url</name> <value>jdbc:mysql//localhost:3306/BookDb?autoReconnect=true</value> </parameter>

</ResourceParams>

C.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在Web应用中引用JNDI资源    属性 描述 description 对所引用的资源的说明 res-ref-name 指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应 res-type 指定所引用资源的类名字,与<Resource>元素中的type属性对应 res-auth 指定所引用资源的Manager,与<Resource>元素中的auth属性对应

javax.naming.Context提供了查找JNDI Resource的接口,可以通过三个步骤来使用数据源对象:

A.获得对数据源的引用:     Context ctx = new InitalContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookDb");

B.获得数据库连接对象: Connection con = ds.getConnection();    C.返回数据库连接到连接池: con.close();

在连接池中使用close()方法和在非连接池中使用close()方法的区别是:前者仅仅是把数据库连接对象返回到数据库连接池中,是连接对象又恢复到空闲状态,而非关闭数据库连接,而后者将直接关闭和数据库的连接

如果通过数据源访问数据库,由于数据源由Servlet容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。

实例部分摘自:http://blog.okn.cn/article.html?id=385

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值