JNDI简介
JNDI的全称是Java命名与目录接口(Java Naming and Directory Interface),是一个有关应用程序设计的API,为开发人员提供了查找和访问各种命名与目录服务的通用,统一的接口。
通过名称将资源与服务进行关联。
JNDI的作用与优点
1、在应用与Java对象或资源之间建立松耦合的逻辑关联,简化应用对于资源的配置及维护工作
2、可以在更大范围、不同应用之间共享资源
JNDI的简单应用
Tomcat\conf\context.xml文件
<Context> <Environment name="tjndi" value="hello JNDI" type="java.lang.String" /> </Context>
<Environment>元素用于配置命名的值,所配置的值作为环境条目资源,对整个Web应用可见,它包含的属性有name,type,value。
name:环境条目的名称,相对于java:comp/env的名称。
type:环境条目的Java类名的全称。
value:通过JNDI context请求时,返回给应用的参数值,该值必须转换成type属性定义的Java类型。
lookup()进行查找
// javax.naming.Context提供了查找JNDI 的接口 Context ctx = new InitialContext(); //初始化Context对象 // java:comp/env/为前缀 String testjndi = (String) ctx.lookup("java:comp/env/tjndi");//调用lookup()方法 out.print("JNDI: " + testjndi);
JNDI的基本步骤
1)配置资源
2)通过Context的lookup()方法查找资源
数据库连接池
Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
传统数据库连接方式的不足
需要经常与数据库建立连接,在访问结束后必须关闭连接释放资源
当并发访问数量较大时,执行速度受到极大影响
系统的安全性和稳定性相对较差
数据源与连接池
javax.sql.DataSource接口的实现类
Java程序访问数据库时只需从连接池中取出空闲状态的数据库连接,当程序访问数据库结束时,再将数据库连接返回给连接池,这样做可以提高数据库的效率。
2) 使用时向连接池申请可用连接
3) 使用完毕,将连接返还给连接池
4) 程序退出时,断开所有连接,并释放资源
JNDI资源
Tomcat支持将DataSource实现发布为JNDI资源
Web应用通过JNDI获得DataSource引用
javax.naming。Context的lookup()方法查找JNDI Resource的接口,例如:可以通过以下代码获得名称为jdbc/news的数据源
//初始化上下文 Context ctx=new InitialContext(); //获取与逻辑名相关联的数据源对象 DataSource ds=(DataSource)ctx.lookup(“java:comp/env/jdbc/news”);
DataSource对象后,可以通过DataSource的getConnection()方法来获得数据库连接对象
Connection conn=ds.getConnection();
Connection的close()方法及时将Connection返回给数据库连接池,使Connection恢复空闲状态。
1.conntext.xml文件的配置
<Context> <Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="newsu" password="123456" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/newsmanagersystem? useUnicode=true&characterEncoding=utf-8" /> </Context>
DataSource对象Resource元素属性
属性名称 | 说明 |
name | 指定Resource的JNDI名称 |
auth | 指定管理Resource的Manager |
type | 指定Resource所属的Java类 |
maxActive | 指定连接池中处于活动状态的数据库连接的最大数目 |
maxIdle | 指定连接池中处于空闲状态的数据库连接的最大数目 |
maxWait | 指定连接池中的连接处于空闲的最长时间 |
2.web.xml文件的配置
a)添加数据库驱动文件
jar文件,加入到Tomcat的lib中
b)配置应用程序的web.xml文件
web.xml中配置<resource-ref>
<resource-ref> <res-ref-name>jdbc/news</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
jdbc/news
JNDI的名字,与<Resource>元素中的name一致
javax.sql.DataSourc
<Resource>元素中的type一致
Container
Manager与<Resource>元素中的auth一致
resource-ref元素的属性
属性 | 说明 |
description | 对所引用资源的说明 |
res-ref-name | 指定所引用资源的JNDI名字,与<Resource>元素中的name属性对应 |
res-type | 指定所引用资源的类名字,与<Resource>元素中的type属性对应 |
res-auth | 指定管理所引用资源的Manager,与<Resource>元素中的auth属性对应 |
JNDI获得数据源对象时的步骤
1)配置conntexrt.xml文件
2)配置web.xml文件。
3)添加数据库驱动
4)编写代码,使用lookup()方法获得数据源对象
1、上一层依赖其下一层、依赖关系不跨层
2、下一层不能调用上一层
3、下一层不依赖于上一层
4、在上一层中不能出现下一层的概念
1,23
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码
3、增加了代码量,增加了工作量