初学JNDI

来源:互联网 发布:什么直播软件有黄播 编辑:程序博客网 时间:2024/05/01 09:51

JNDI的全称是java命名与目录接口(JAVA Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录

的通用,统一的接口。

我们可以把JNDI简单地理解为是一种将对象和名字绑定的技术,即指定一个资源名称,将该名称与某一资源或服务相关联,尤其在分布式应用系统中

,当需要访问其他组件和资源时,就需要使用JNDI服务进行定位,应用程序可以通过名字来获得对象的对象或服务。

使用JNDI可以访问的目录和服务很多,例如DNS,文件服务,数据库等。

JNDI的使用步骤:

修改tomcat\conf目录中的context.xml,添加Environment元素

<Context> <Environment name="tjndi" value="hello world" type="java.lang.String" /></Context>

Environment 元素常用属性如下:
name:相对于java:comp/env的名称
type:java类名
value:返回给应用的参数值

新建testjndi.jsp页面测试JNDI,添加如何内容:

//javax.naming.Context提供了查找JNDI 的接口Context ctx = new InitialContext();//java:comp/env/为前缀String testjndi = (String) ctx.lookup("java:comp/env/tjndi");out.println("JNDI: " + testjndi);

输出:JNDI:hello world

为了避免JNDI命名空间中的资源名称互相冲突,并且避免可移植性问题,javaEE应用程序中的所有名称应该以字符串“java:comp/env”开始


数据源与JNDI资源:

DataSource对象是由web容器(tomcat)提供的,因此不能在程序中采用创建对象的方式生成DataSource对象,但可以使用JNDI实现。

javax.naming.Context提供了查找JNDI Resource的接口,可以通过以下方式获得jdbc/news数据源

/./ 初始化上下文
Context ctx = new InitialContext();
//获取与逻辑名相关联的数据源对象
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news");
Connection conn = ds.getConnection(); // 得到连接对象
当程序结束数据库访问后,应该调用conn.close()方法及时将Connection返回给数据库连接池,使Connection恢复空闲状态。Context中的

loopup()方法可以返回与指定的名字绑定的对象。

Tomcat把DataSource作为一种可配置的JNDI资源来处理。假定配置了一个DataSource,数据源名为jdbc/news,应用程序访问jdbc/news

的DataSource的过程如下:


1.将JDBC驱动放于tomcat的lib下

2.修改context.xml添加Resource元素配置数据源:

 <Context ...>  <Resource name="jdbc/news" auth="Container"            type="javax.sql.DataSource"            factory="org.apache.commons.dbcp.BasicDataSourceFactory"            username="sa" password="123456"            driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"            url="jdbc:sqlserver://localhost:1433;DatabaseName=news"            maxActive="8" maxIdle="4"/></Context>

相关属性说明:

name:JDBC数据源的名称。

auth:

type:当前配置资源的类别。

factory:数据源工厂,默认为"org.apache.commons.dbcp.BasicDataSourceFactory"。

driverClassName - 驱动的全路径类名。

maxActive - 当前数据源支持的最大并发数。

maxIdle - 连接池中保留最大数目的闲置连接数。

maxWait - 当连接池中无连接时的最大等待毫秒数,在等当前设置时间过后还无连接则抛出异常。

username - 访问数据库的用户名

password - 访问数据库的密码

url - JDBC驱动的连接字符串

validationQuery - 在返回应用之前,用于校验当前连接是否有效的SQL语句,如果指定了,当前查询语句至少要返回一条记录。

3.配置项目下的web.xml

<web-app>
<Resource>
-->
<Resource>
--><resource-ref><description>new DataSource</description><!--对引用资源的说明 --><res-ref-name>jdbc/news</res-ref-name> <!--引用资源的JNDI名字,与<Resource>元素的name属性对应 --><res-type>javax.sql.DataSource</res-type><!--引用资源的类名字,与<Resource>元素的type属性对应 --><res-auth>Container</res-auth><!--指定管理所引用资源的Manager,与<Resource>元素的auth属性对应 --></resource-ref></web-app>

4.测试数据源

Context ctx = new InitialContext();//初始化上下文try {DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/ktv");Connection conn = ds.getConnection();if (conn == null) out.println("连接失败");else out.println("连接成功");} catch (Exception e) {out.println(e.toString());e.printStackTrace();}

使用JNDI获取数据源对象可分为四个步骤:

(1)配置contex.xml文件

(2)配置web.xml文件

(3)添加驱动

(4)编写代码,使用loopup()方法获得数据源对象。