- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据库连接池技术浅析
--般情况下,在使用开发基于数据库的WEB程序时,传统的模式基木是按以 下步骤:
在主程序(如Servlet、Beans)屮建立数据库连接。
进行SQL操作,取出数据。
断开数据库连接。
使用这种模式开发,存在很多问题。首先,我们要为每一次WEB请求(例如 察看某一?篇文章的内容)建立一次数据库连接,对于一次或几次操作來讲,或许 你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的吋间段内, 其操作请求数也远远不是一?两次,而是数十上百次(想想全世界的网友都有可能 在您的网页上查找资料),在这种情况下,系统开销是相当大的。事实上,在一 个基于数据库的WEB系统屮,建立数据库连接的操作将是系统屮代价最大的操作 之一。很多吋候,可能您的网站速度瓶颈就在于此。
其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭, 如果出现程序男常而导致某些连接未能关闭,将导致数据库系统屮的内存泄露, 最终我们将不得不重启数据库。
针对以上问题,我们首先想到可以采用一-个全局的Connection对象,创建 后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭连接的问题了。 但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致WEB SERVER 的频频重启。故而,这种方法也不可取。实际丄,我们可以使用连接池技术来解 决上述问题。首先,介绍一下连接池技术的基本原理。顾名思义,连接池最基本 的思想就是预先建立一些连接放置于内存对象111以备使用:
连接池ooo塑
连接池
o
o
o
塑W4-—翕
Servlet、 Beans
SQL操作
如图所示,肖程序屮需要建立数据库连接时,只须从内存屮取一个来用而不 用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接 池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池屮的连接 数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同 吋,我们可以通过其口身的管理机制来监视数据脖连接的数量、使用情况等。下 浙我们以…个名为ConnectionPool的连接池为例来看看连接池的实现。先看看
ConnectionPool的基本属性:
m ConnectionPoolSize:连接池屮连接数量下限
m Connecti onPoolMax:连接池屮连接数量上限 mConnect i onUseCount :—个连接的最大使用次数 m ConnectionTimeout: 一个连接的最长空闲时间 m MaxConnections = -1:同一吋间的最大连接数 m timer:定吋器
这些属性定义了连接池与其屮的每个连接的有效状态值。连接池的自我管 理,实际上就是通过定吋的对每个连接的状态、连接的数量进行判断而进行相应 操作。其管理流程如下:
定时器 Timer
检査连接数量遍历每个连接的状态是是关 接己闭 连否、从连接池中删除新建连接使数量达到下限是是是K0否空
检査连接数量
遍历每个
连接的状态
是
是关 接己闭 连否、
从连接池中删除
新建连接使数量
达到下限
是
是
是
K0
否
空
接闲连、
连 知接
通过上图,我们可以定义出ConnectionPool要完成管理所需要的基本接口: publ ic class ConnectionPool implements TimerListener{
public boolean initialize() //连接池初始化
public void destroy() //连接池的销毁
publ ic synchronized java. sql. Connection getConnection () //取—?个连 接
public synchronized void close() //关闭一个连接
private synchronized void removeFromPool () //把一个连接从连接池屮 删除
private synchronized void filIPool () //维护连接池大小
public synchronized void TimerEvent () //定时器事件处理函数
}
通过这儿个接口,己经可以完成连接池的基本管理。在TimeEvent ()函数 屮完成连接池的状态检验工作,f ilIPool 0时连接池至少保持最小连接数。因为 我们要保存每一个连接的状态,所以还需要一个数据库连接对象: class Connectio门Object{
public java. sql. Connection con; public boolean inUse; //是否被彳吏用 标志
public long lastAcce
文档评论(0)