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:返回给应用的参数值
//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-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.测试数据源<Resource>
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()方法获得数据源对象。