-
一种简单
JDBC
连接池的实现
作者:未知
发布时间:
2005-05-12
<
/p>
来源:
JSP
天空网
1.
前言
数据库应用,
在许多软件系统中经常
用到,
是开发中大型系统不可缺少的辅助。
但如果对数据库资源
没有很好地管理
(
如:没有及时回收数据库的游标
(ResultSet)
、
Statement
p>
、连接
(Connection)
等资源
)
,往往会直接导致系统的稳
定。这类不稳定因素,不单单由数据库或者系统本身一方引起,只有系统正式
使用后,随着流量、用户的增加,才会逐步显露。
在
b
基于<
/p>
Java
开发的系统中,
JDBC
是程序员和数据库打交道的主要途径,提
供了完备的数据库操作方法接
口。但考虑到规范的适用性,
JDBC
只提供了最
直接的数据库操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,
期望第三方应用服务器
(Application
Server)
的提供。
本文,以
JDBC
< br>规范为基础,介绍相关的数据库连接池机制,并就如果以简单
的方式,实现有效地
管理数据库资源介绍相关实现技术。
2.
连接池技术背景
2.1JDBC
JDBC
是一个规范,遵循
JDBC
接口规范,各个数据库厂家各自实现
自己的驱
动程序
(Driver)
,如
下图所示
:
应用在
获取数据库连接时,
需要以
URL
的方
式指定是那种类型的
Driver
,
在
获
得特定的连接后,可按照固定的接口操作不同类型的数据库,如
:
分别获取
Statement
、
执行
SQL
获得
ResultSet<
/p>
等,如下面的例子
:
import .*;
…
..erDriver(
new .
Driver());
Connection dbConn = nection
(“jdbc:oracle:thin:@127.0.0.1:1521:
oracle”,“username”, “password”
);
Statement st =
Statement();
ResultSet rs = eQuery(
“select
* from demo_table” );
…
some data
source operation in ();
();();
在完成
数据操作后,还一定要关闭所有涉及到的数据库资源。这虽然对应用程
序的逻辑没有任何
影响,但是关键的操作。上面是个简单的例子,如果搀和众
多的
if-else
、
exception
,资源的管理也难免百密一疏。如同
C
中的内存泄漏问
题,
Java
系统也同样会面临崩溃的恶运。所
以数据库资源的管理依赖于应用系
统本身,是不安全、不稳定的一种隐患。
2.2JDBC
连接池
在标准
J
DBC
对应用的接口中,并没有提供资源的管理方法。所以,缺省的资
< br>源管理由应用自己负责。
虽然在
JDBC
规范中,
多次提及资源的关闭
/
回收及其
他的合理运用。
但最稳妥的方式,
< br>还是为应用提供有效的管理手段。
所以,
JDBC
为第三方应用服务器(
Application Server
)提供了一个由数据库厂家实现的管
理标准接口:连接缓冲
(connection pooling)
。引入了连接池
( Connection
Pool )
的概念
,也就是以缓冲池的机制管理数据库的资源。
JDBC
最常用的资源有三类
:
-Connection:
数据库连接。
-Statement:
会话声明。
-ResultSet:
结果集游标。
分别存在以下的关系
:
这是一种
?
爷
-
父
-
子<
/p>
?
的关系,对
Connection<
/p>
的管理,就是对数据库资源的管
理。举个例子
:
如果想确定某个数据库连接
(Connection)
是否超时,则需要确定
其(所有的)子
Statement
是否超时,同样,需要确定所有相关的
Re
sultSet
是
否超时;在关闭
Co
nnection
前,需要关闭所有相关的
Statement
和
ResultSet
。
因此,连接池
(Connection Pool)
所起到的作用,不仅仅简单地管理
Connection
< br>,
还涉及到
Statemen
t
和
ResultSet
。
2.3
连接池
(ConnectionPool)
与资源
管理
C
onnectionPool
以缓冲池的机制,
在一定数量上限
范围内,
控制管理
Connection
,
Statement
和
Resul
tSet
。
任何数据库的资源是有限的,
如果被耗尽,
则无法获得
更多的数据服务。
< br>
在大多数情况下,资源的
耗尽不是由于应用的正常负载过高,而是程序原因。
在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访
问同一数据源。
其中某个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因
此,
ConnectionPool
的第一个任务是限制:每个
应用或系统可以拥有的最大资源。
也就是确定连接池的大小
(P
oolSize)
。
ConnectionPool
的第
二个任务:在连接池的大小
(PoolSize)
范围内,最大
限度地
使用资源,缩短数据库访问的使用周期。许多数据库中,连接(
< br>Connection
)
并不是资源的最小单元,控制<
/p>
Statement
资源比
Connec
tion
更重要。以
Oracle
为例
:
每申
请一个连接
(
Connection
)
会在物理网络
(如
< br>TCP/IP
网络)
上建立一个用
于通讯的连接,
在此连接上还可以申请一定数量的
State
ment
。
同一连接可提供
的活跃
p>
Statement
数量可以达到几百。
在节约网络资源的同时,缩短了每次会
话周期
< br>(物理连接的建立是个费时的操作)
。
但在一般的应用中
,
多数按照
2.1
范例操作,这样有<
/p>
10
个程序调用,则会产生
10
次物理连接,每个
Statement
单独占用
一个物理连接,
这是极大的资源浪费。
ConnectionPool
可以解决这个
问题,让几十、
几百个
Statement
只占用同一个物理连接,
发挥数据库原有的
优点。
通过
Co
nnectionPool
对资源的有效管理,
应用可以获得的
Statement
总数到达
:
(并发物理连接数)
x
(每个连接可提供的
Statement
数量)<
/p>
例如某种数据库可同时建立的物理连接数为
< br>200
个,每个连接可同时提供
250
< br>个
Statement
,
那么<
/p>
ConnectionPool
最终为应用提供的并发
Statement
总数为
: 200
x 250 = 50,000
个。
这
是个并发数字,
很少有系统会突破这个量级。
所以在本节
的开始,指出资源的耗尽与应用程序直接管理有关。
对资源的优化管理,很大程度上依靠数据库自身的
JDBC D
river
是否具备。有
些数据库的
J
DBC Driver
并不支持
Connection
与
Statement
之间的逻辑连接功
能,如
SQLServer
,我们只能等待她
自身的更新版本了。
对资源的申请、释放、回收、共享和同步,这些管理是复杂精密的。所以,
ConnectionPool
另一个功能就是,封装这些操作,为应用提供简单的,甚
至是
不改变应用风格的调用接口。
-
-
-
-
-
-
-
-
-
上一篇:C# treeView控件的动态添加两层节点
下一篇:LTE空口信令分析