JDBC-数据库连接池

时间:2021-07-31 11:49:48

一、数据库连接池简介

1.简介
在实际开发中,特别是在Web应用中,如果在JSP中直接使用JDBC来访问数据库中的数据,每一次数据访问请求都必须经过数据库连接、打开数据库、存取数据和关闭数据库等步骤,而连接和打开数据库是一件耗费时间的工作,同时也消耗大量系统内存,而且频繁的执行这些数据库操作,可能会导致系统的崩溃。而数据库连接池技术就是解决这个问题最常用的方法。
2.访问数据库流程
该流程基本分为以下几步:
(1) 建立数据库连接池对象(服务器启动时自动完成)
(2) 按照指定的参数创建初始数量的数据库连接对象
(3) 对于一个客户端数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池中没有空闲的链接对象,且连接数没有达到最大(即最大活跃连接数),则创建一个新的连接数据库对象。
(4) 获取数据库连接,执行数据库操作
(5) 关闭数据库连接,释放所获得的数据库连接(此时的关闭数据库连接并非真正的关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
(6) 释放数据库连接池对象(服务器停止、维护期间,释放所有连接)

二、配置数据库连接池

1.添加配置代码到content.xml文件中
(1) 该配置文件存放在Server/Tomcat v7.0 Server at localhost-config文件夹下。
JDBC-数据库连接池

(2) 配置代码如下:

<Resource name="jdbc/dbpooling" auth="Container"        type="javax.sql.DataSource"
password="Aa123789" username="sa" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://localhost:1433; DatabaseName=UserInfo"
maxActive="100" maxIdle="30" maxWait="5000" /

(3) Resource相关参数属性说明
name属性:该属性是用来设置数据库连接池的JNDI的名字
username属性:该属性是用来设置连接数据库的用户名
password属性:该属性是用来设置连接数据库的密码
driverClassName属性:该属性是用来设置JDBC驱动程序名
url属性:该属性是用来设置JDBC的数据库连接的URL
maxActive属性:该属性是用来设置连接池最大的连接数
maxIdle属性:该属性是用来设置数据库连接的最大空闲时

2.在web.xml中添加数据库连接池的引用代码
(1) 配置文件存放在%项目所在文件夹%/WebContent/WEB-INF文件夹下
JDBC-数据库连接池
(2) 引用代码如下:

<resource-ref>
<!-- 对数据库连接池的描述 -->
<description>SQL Server 2008 DataSource</description>
<!-- 数据库连接池的引用名称 -->
<res-ref-name>jdbc/dbpooling</res-ref-name>
<!-- 数据库连接池的引用类型 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

三、数据库连接池测试

1.导入数据库相关包

<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>

2.在body里添加测试代码

<%
try{
DataSource ds = null;
//建立上下文对象
InitialContext ctx = new InitialContext();
//通过JNDI查找数据库连接池
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/dbpooling");
//获取数据库连接对象
Connection conn = ds.getConnection();
//创建PreparedStatement对象
PreparedStatement pState = conn.prepareStatement("Select * from userInfo");
//获取结果集
ResultSet rs = pState.executeQuery();
out.println("<table border=1>");
out.println("<tr><td>用户名</td><td>密码</td></tr>");
while(rs.next()){
out.println("<tr><td>");
out.println(rs.getString(2));
out.println("</td><td>");
out.println(rs.getString(3));
out.println("</td></tr>");
}
out.println("</table>");
}catch(SQLException se){
out.print(se);
}
%>