JDBC连接池技术

时间:2022-09-19 23:23:05


一.连接池技术

(1)Java语言通过JDBC技术访问数据库的基本过程是:
1.加载数据库驱动程序;
2.通过JDBC建立数据库连接;
3.访问数据库,执行SQL语句;
4.断开数据库连接。

(2)在Web应用程序开发中,使用这种模式访问数据库时,存在很多问题,为了解决这些问题,可以采用数据库连接池技术。 连接池实际上是在一个集合对象中存储一定数量的数据库连接对象。当程序需要使用数据库连接时,请求从池中获取一个空闲的连接, 程序使用完毕后再把连接放回池中重用。连接池通过重用连接的方法,减少了创建连接的系统开销,能够明显提高系统的数据库访问效率。
(3)为解决上述问题可以使用连接池技术,连接池实际上是一个集合对象中存储一定数量的数据库连接对象。
(4)在JSP技术中,一般是通过数据源来使用连接池,一个数据对象会被注册为web服务器的一个JNDI资源, 应使用程序通过JDNI获取数据源对象,再通过数据源对象取得数据库连接,连接池为数据源提供物理连接。

二.使用方法

(1)用文本编辑器打开c:\tomcat\conf\context.xml文件,在<Context></Context>元素内部添加如下的数据源配置代码:
JDBC连接池技术


(2)应用程序通过数据源取得数据库连接的基本过程是:利用上下文对象,根据JNDI名取得一个数据源对象,通过数据源对象取得一个连接。
(3)JNDI的全称是Java命名和目录接口(java naming and directory interface)他是sun公司提供的java命名和目录访问接口。
主要方法如下: 1.javax.naming.Context 这个方法提供的lookup方法能在JNDI上下文中查找一个命名对象,返回一个object对象 2.javax.naming.InitialContext 3.javax.sql.DtaSource 数据源是一个和物理连鸡翅相关联的工厂类Factory 伟世通Datasource对象,必须为之指定连接池,连接池为JNDI数据源提供物理连接;

三.实例分析


(1)写两个JSP页面,一个从连接池中取得连接查询pubs数据库的titles表,另一个使用JDBC驱动程序获得连接查询pubs数据库的titles表, 每个JSP页面执行查询语句500次,并通过查询分析器记录下相关的连接信息,比较两种数据库连接方式的数据库访问效率。
操作步骤如下:

第1步:定义连接池和数据源。用文本编辑器打开c:\tomcat\conf\context.xml文件,在<Context></Context>元素内部添加配置代码(内容上述有介绍省去)

第2步:新建JSP页面,用连接池方式访问pubs/titles表500次。 
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<%@page import="javax.sql.*,javax.naming.*"%>
<%
long beginTime=System.currentTimeMillis();
int n=500;
ResultSet rs=null;
Statement st=null;
Connection con=null;
for(int i=0;i<n;i++)
{
try
{
Context ctx=new InitialContext(); //获得一个上下文对象
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/pubs"); //通过上下文对象在JNDI中查找指定名字的数据源
con=ds.getConnection();//通过数据源获得一个连接池

String sql="select title,type,price from titles ";
st=con.createStatement();
rs=st.executeQuery(sql);
while(rs.next())
{
rs.getString("title");
rs.getString("type");
rs.getString("price");
}
}
catch(Exception e)
{
out.print(e.getMessage());
}
finally
{
if(rs!=null)
rs.close();
if(st!=null)
st.close();
if(con!=null)
con.close();
}
}
long endTime=System.currentTimeMillis();
out.print("用连接池作500次查询耗时:"+(endTime-beginTime)+"毫秒");
%>
</body>
</html>



第3步:新建一个名为exam623.jsp 的JSP页面,用JDBC驱动程序直接访问pubs/titles表500次。 


<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<%@page import="javax.sql.*,javax.naming.*"%>
<%
long beginTime=System.currentTimeMillis();
int n=500;
ResultSet rs=null;
Statement st=null;
Connection con=null;
for(int i=0;i<n;i++)
{
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url="jdbc:sqlserver://localhost:1433;databaseName=pubs;user=sa;password=";
con = DriverManager.getConnection(url);

String sql="select title,type,price from titles ";
st=con.createStatement();
rs=st.executeQuery(sql);
while(rs.next())
{
rs.getString("title");
rs.getString("type");
rs.getString("price");
}
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
out.print(e.getMessage());
}
finally
{
if(rs!=null)
rs.close();
if(st!=null)
st.close();
if(con!=null)
con.close();
}
}
long endTime=System.currentTimeMillis();
out.print("直接用JDBC连接作500次查询耗时:"+(endTime-beginTime)+"毫秒");
%>
</body>
</html>

(2)这个不用多数,效果看得见!

注:希望大家在转载的时候注明出去!