<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.javafan.net/article/20040225085618607.html -->
<HTML><HEAD><TITLE>一种简单JDBC数据库连接池的实现</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=免费Java教程下载,Java电子书籍,JDBC,Pool,连接池 name=keywords><LINK
href="一种简单JDBC数据库连接池的实现.files/style.css" rel=stylesheet>
<STYLE>TD {
FONT-SIZE: 13px; COLOR: #646464; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
</STYLE>
<SCRIPT>
function fontZoom(size)
{
document.getElementById('fontzoom').style.fontSize=size+'px'
}
</SCRIPT>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width=751 align=center border=0>
<TBODY>
<TR>
<TD><IMG height=75 src="一种简单JDBC数据库连接池的实现.files/u_11.gif" width=751></TD></TR>
<TR>
<TD vAlign=top background=一种简单JDBC数据库连接池的实现.files/u_bg.gif><BR>
<DIV align=right>页面功能 【<A
href="javascript:window.external.AddFavorite(location.href,document.title+'--www.JavaFan.NET');">加入收藏</A>】
【<A
onclick="window.open(this.href,'','top=180,left=240,width=342,height=326,scrollbars=yes,resizable=no');return false;"
href="http://www.javafan.net/sendarticle.jsp?title=一种简单JDBC数据库连接池的实现&URL=20040225085618607">推荐给朋友</A>】
【字体:<A class=black href="javascript:fontZoom(15)">大</A> <A
class=black href="javascript:fontZoom(13)">中</A> <A class=black
href="javascript:fontZoom(12)">小</A>】 【<A class=black
href="javascript:window.close()">关闭</A>】 </DIV>
<TABLE cellSpacing=0 cellPadding=0 width=740 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=right>
<TABLE cellSpacing=0 cellPadding=0 width=730 border=0>
<TBODY>
<TR>
<TD><IMG height=11 src="一种简单JDBC数据库连接池的实现.files/u_14.gif"
width=10></TD>
<TD style="BORDER-TOP: #e8e8e8 1px solid" bgColor=#f9f9f9><IMG
height=1 src="" width=1></TD>
<TD><IMG height=11 src="一种简单JDBC数据库连接池的实现.files/u_15.gif"
width=10></TD>
<TD vAlign=top width=8 rowSpan=3><BR><IMG height=136
src="一种简单JDBC数据库连接池的实现.files/u_13.gif" width=8></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: #e8e8e8 1px solid; BORDER-LEFT: #e8e8e8 1px solid"
align=middle bgColor=#f9f9f9 colSpan=3>
<TABLE style="WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width=700 align=center border=0>
<TBODY>
<TR>
<TD align=middle height=25><FONT face=黑体
size=4>一种简单JDBC数据库连接池的实现</FONT></TD></TR>
<TR bgColor=#f9f9f9>
<TD id=fontzoom style="LINE-HEIGHT: 200%">
<P
align=center>作者:snapbug 来自:CSDN</P>
<P>
<P>目录:<BR>1. 前言<BR>2. 连接池技术背景<BR>2.1
JDBC<BR>2.2 JDBC连接池<BR>2.3
连接池(ConnectionPool)与资源管理<BR>3. 简单JDBC连接池的实现<BR>3.1
体系描述<BR>3.2 连接池集中管理ConnectionManager<BR>3.3
连接池使用范例<BR>4.
小结<BR> <BR><STRONG>1.前言<BR></STRONG>数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如果对数据库资源没有很好地管理(如:没有及时回收数据库的游标(ResultSet)、Statement、连接
(Connection)等资源),往往会直接导致系统的稳定。这类不稳定因素,不单单由数据库或者系统本身一方引起,只有系统正式使用后,随着流量、用户的增加,才会逐步显露。<BR>在基于Java开发的系统中,JDBC是程序员和数据库打交道的主要途径,提供了完备的数据库操作方法接口。但考虑到规范的适用性,JDBC只提供了最直接的数据库操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,期望第三方应用服务器(Application
Server)的提供。<BR>本文,以JDBC规范为基础,介绍相关的数据库连接池机制,并就如果以简单的方式,实现有效地管理数据库资源介绍相关实现技术。</P>
<P><STRONG>2.连接池技术背景<BR></STRONG>2.1 JDBC
<BR>JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序(Driver),如下图所示:</P><IMG
src="一种简单JDBC数据库连接池的实现.files/CSDN_Dev_Image_2003-12-31319590.png">
<P>应用在获取数据库连接时,需要以URL的方式指定是那种类型的Driver,在获得特定的连接后,可按照固定的接口操作不同类型的数据库,如:
分别获取Statement、执行SQL获得ResultSet等,如下面的例子 :</P>
<P>import
java.sql.*;<BR>…<BR>DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver());<BR>Connection
dbConn =
DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");<BR>Statement
st = dbConn.createStatement();<BR>ResultSet rs =
st.executeQuery("select * from demo_table");</P>
<P>…some data source operation in here</P>
<P>rs.close();<BR>st.close();<BR>dbConn.close();</P>
<P>在完成数据操作后,还一定要关闭所有涉及到的数据库资源。这虽然对应用程序的逻辑没有任何影响,但是关键的操作。上面是个简单的例子,如果搀和众多的if-else、exception,资源的管理也难免百密一疏。如同C中的内存泄漏问题,Java系统也同样会面临崩溃的恶运。所以数据库资源的管理依赖于应用系统本身,是不安全、不稳定的一种隐患。</P>
<P>2.2
JDBC连接池<BR>在标准JDBC对应用的接口中,并没有提供资源的管理方法。所以,缺省的资源管理由应用自己负责。虽然在JDBC规范中,多次提及资源的关闭/回收及其他的合理运用。但最稳妥的方式,还是为应用提供有效的管理手段。所以,JDBC为第三方应用服务器(Application
Server)提供了一个由数据库厂家实现的管理标准接口:连接缓冲(connection
pooling)。引入了连接池( Connection Pool )的概念
,也就是以缓冲池的机制管理数据库的资源。</P>
<P>JDBC最常用的资源有三类: <BR>— Connection: 数据库连接。<BR>—
Statement: 会话声明。<BR>— ResultSet: 结果集游标。</P>
<P>分别存在以下的关系 :<BR><IMG
src="一种简单JDBC数据库连接池的实现.files/CSDN_Dev_Image_2003-12-31319592.png"><BR>这是一种“爷—父—子”的关系,对Connection的管理,就是对数据库资源的管理。举个例子:
如果想确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)子Statement是否超时,同样,需要确定所有相关的ResultSet是否超时;在关闭Connection前,需要关闭所有相关的Statement和ResultSet。<BR>因此,连接池(Connection
Pool)所起到的作用,不仅仅简单地管理Connection,还涉及到
Statement和ResultSet。</P>
<P>2.3
连接池(ConnectionPool)与资源管理<BR>ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,Statement和ResultSet。任何数据库的资源是有限的,如果被耗尽,则无法获得更多的数据服务。<BR>在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。<BR>在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运