学习要点
- JNDI
- 数据库连接池
- 完成新闻发布系统数据库连接池
JNDI
说明
JNDI(Java Naming and Directory Interface),中文翻译为Java命名与目录接口,是一个为应用程序设计的API,为开发人员提供了查找和访问各种命名和目录的统一、统一接口。
简而言之,JNDI就是通过名称将资源与服务进行关联的技术。JNDI可以访问的目录和服务有:DNS、文件服务、数据库等等。
案例
需求描述:如何实现在Tomcat中发布一条信息供所有的Web应用程序使用?
需求分析:类似于全局变量application,但application只用于本Web应用程序共享数据。
解决方案
- 第一步发布信息:修改Tomcatconfcontext.xml文件。
<Context> <Environment name="testjndi" value="hello JNDI" type="java.lang.String" /> </Context>
context文件是全局的上下文配置文件,对所有的web应用程序有效。
<Environment>元素用于配置命名的值,所配置的值作为环境条目资源,对整个web应用可见。包含属性有:name、value、type。
name:环境条目的名称,相对于java:comp/env的名称。
type:环境条目的java类全名。
value:通过JNDI context请求时,返回给应用的参数值,该值必须转换成type属性定义的Java类型。
- 第二步获取资源:使用lookup()进行查找
<% //javax.naming.Context提供了查找JNDI 的接口 Context ctx = new InitialContext(); //java:comp/env/为前缀 String testjndi = (String) ctx.lookup("java:comp/env/testjndi"); out.print("JNDI:" + testjndi); %>
为了避免JNDI空间中资源名称的相互冲突,并确保避免可移植性问题,JavaEE应用程序中的所有命名应以字符串“java:comp/env”作为前缀。
- 运行结果
上机练习:在Tomcat中发布一条信息供所有的Web应用程序使用
参考演示实例完成上级练习。
数据库连接池
JDBC访问数据库的缺点
- 需要经常与数据库建立连接
- 在访问结束后必须要关闭连接释放资源
- 当并发访问数量较大时,网站速度收到极大影响
- 系统的安全性和稳定性相对较差
所以,项目上线后考虑采用数据库连接池技术。开发测试阶段建议采用JDBC方式,JDBC便于调试。
数据库连接池
- 定义
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新创建一个;释放空闲时间超过做大空闲时间的数据库连接,以避免没有释放数据库连接而引起的数据库连接遗漏。
- 连接池管理连接
- 数据库连接池的基本思想就是为数据库连接建立一个“空闲池”。预先在空闲池中放入一定数量的连接。
- 当需要建立数据库连接时,系统检查空闲池中是有有连接,如果有,则从“空闲池”中取出一个。如果没有,则判断是否已经达到连接池所允许的最大连接数,若没有达到最大连接数,则新建一个连接返回;如果已经达到最大连接数,则继续等待,直到有空闲连接;如果超过预定等待时间,则返回一个NULL连接。
- 应用程序使用完连接,放回连接池。
- 我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。
数据源
- javax.sql.DataSource用来负责建立与数据库的连接,他是用来描述现实存在的数据源,配置好的数据库连接池就是以数据源的形式存在的。
- 数据源(DataSource)
- 从Tomcat的数据源获得连接
- 把连接返回给连接池
- 数据源的close()方法是把连接返回给数据库连接池。
- DataSource对象是由Web容器提供的。
- 连接池中(DataSource)的连接由web容器创建。
数据源与JNDI资源
DataSource对象是web容器提供的,如何获取DataSource对象呢?
通过JNDI来获取!
<% //初始化上下文 Context ctx = new InitialContext(); //获得与逻辑名称相关联的数据源对象 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news"); //获得连接 Connection conn = ds.getConnection(); %>
数据源的配置
- 第一步:配置context.xml文件:在<Context>节点下添加如下内容
<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mynews?" />
Resource属性说明
属性名称 |
说明 |
name |
指定Resource的JNDI名称 |
auth |
指定管理Resource的Manager。有两个值:Container:由容器创建和管理;Application:由Web应用创建和管理。 |
type |
指定Resource所属的Java类 |
maxActive |
指定连接池中处于活动状态的数据库连接的最大数目 |
maxIdle |
指定连接池中处于空闲状态的数据库连接的最大数目。0不受限 |
maxWait |
指定连接池中的连接处于空闲的最长时间。-1表示无限等待 |
username |
指定连接数据库的用户名 |
password |
指定连接数据库的口令 |
driverClassName |
指定连接数据库的JDBC驱动程序 |
url |
指定连接数据库的URL |
数据源除了可以配置在tomcat中,还可以配置在项目中:在webroot目录下的META-INF中,创建一个context.xml文件,添加<Context>节点,然后在<Context>节点添加Resource子节点以及各属性。
- 第二步:配置web.xml文件
在WEB-INF/web.xml文件中的<web—app>节点下添加<resource-ref>元素
<!-- 数据源配置 --> <resource-ref> <description>news_db</description> <!-- 指定JNDI的名字,与<Resource>元素中的name一致 --> <res-ref-name>jdbc/news</res-ref-name> <!-- 指定引用资源的类名,与 <Resource>元素中的type一致 --> <res-type>javax.sql.DataSource</res-type> <!-- 指定管理所引用资源的Manager与<Resource>元素中的auth一致 --> <res-auth>Container</res-auth> </resource-ref>
- 第三步:把数据库驱动添加到WEB-INF/lib/中,并为项目构建驱动路径。
- 第四步:修改BaseDao中的数据库连接方法
// 关键代码 Context ctx = new InitialContext(); // 获得与逻辑名称相关联的数据源对象 DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news"); // 获得连接 conn = ds.getConnection();
上机练习
需求描述
修改新闻发布系统的数据库连接,使用连接池技术。
实现思路
- 配置/tomcat安装目录/conf/context.xml文件(或者在项目META-INFO中添加context.xml文件)
- 配置/webRoot/WEB-INF/web.xml文件
- 在lib目录中添加数据库驱动jar文件
- 在BaseDao中获取数据连接方法中编写代码,实现查找数据源