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程序访问数据库时只需从连接池中取出空闲状态的数据库连接,当程序访问数据库结束时,再将数据库连接返回给连接池,这样做可以提高数据库的效率。
数据库连接池的运行机制
(1) 程序初始化时创建连接池
(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,结构清晰、耦合度低,2,可维护性高,可扩展性高;3,利于开发任务同步进行;容易适应需求变化
劣势:1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码
3、增加了代码量,增加了工作量