- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
?
?
基于Java的数据库连接池技术的算法实现
?
?
罗金涛李跃新
[摘要]数据库连接池是一种非常高效实用的技术。对数据库连接池的基本实现原理进行分析,并给出初步的算法实现。
[关键词]数据源连接池连接JAVAJDBC
:TP3:A:1671-7597(2009)0310052-02
一、引言
在任何的项目开发过程中,都离不开对数据的操作,这一系列的动作最终都体现在底层和数据库的交互,在常规的jdbc数据库操作到时候,总是要反复的打开和关闭对数据库的连接,但是这个过程是一个相当消耗系统资源的过程,对于小的一般程序环境来说,似乎感觉不到性能的影响,但是对于一些多层结构大型企业级的应用程序环境来说,这种反复消耗系统资源的弊端就开始体现出来了。于是很多服务器产品都提供了连接池技术来提高数据库操作的性能,通过连接池技术,可以尽可能多对内存资源进行重用,大大节约了内存的开销,同时能够支持更多的客户服务和提高程序的运行效率,最终从整体上提高到了服务器的运行效率。
二、连接池的产生及基本原理
在早期的java项目开发过程中,当项目开发完成之后,运行的时候发现随着访问量的增长,系统的性能下降得特别的严重,实践表面,导致系统性能下降的原因就是发生在数据库访问阶段,而在此阶段,有一个反复执行的动作,那就是建立和关闭Connection对象,由于关闭操作是在所有的数据库动作执行之后才进行,它主要目的是释放资源,而建立Connection对象的操作是在加载了数据库驱动之后,数据库操作之前必须完成的动作,而且这个对象的生成过程比较耗时,如果每次操作数据库都临时生成一个Connection对象,那么随着并发访问量的增加,必然会影响系统的性能,所以Connection对象的生成就是影响系统性能的主要原因,为了解决这个瓶颈,一个普遍可行的解决方案,就是在应用启动的时候,一次性生成若干个Connection对象,而不是在每次操作数据库的时候去临时生成,这些一次性生成的若干个Connection对象就可以常驻内存中可以反复被使用,这样就避免了Connection对象的创建过程耗时的缺陷,从而使得数据库访问速度得到了很大的提升,瓶颈有效的得到了缓解,这就是数据库连接池技术的产生背景。
图1显示了数据库连接池技术的基本原理。
当客户端访问需要对数据库进行请求,需要先建立数据库的连接对象Connection,此时是向数据源对象(DataSource)进行请求,而数据源对象预先一次性和数据库(Database)建立好了若干个连接(Connection),并将这些连接组成一个连接池(ConnectionPool),由应用程序动态的对连接池中的连接进行申请,使用和释放。当请求的对象用完以后,不需要进行关闭,直接返回给连接池当中,以便其他请求可以重复使用。当并发的请求的数量多于连接池的连接数的时候,这些请求先在排队请求队列当中排队等候,然后由应用程序根据连接池中的使用情况,动态的来增加连接数。
三、数据库连接池基本功能的算法实现
因为连接池的建立已经在它基础上的操作和对集合类型的操作非常相似,因此我们可以将整个实现过程通过对集合类型的对象操作来进行模拟实现,首先,我们要建立一个数据库连接池类ConnectionPool,为了控制在取得连接的过程中只生成一个类的实例,应该用单态模式(Singleton)来设计这个连接池类,通过单态模式可以节省内存的开销,同时也降低了Java虚拟机(JVM)进行垃圾回收的开销。首先需要定义一个私有的构造方法,然后通过保留一个公开的静态方法来取得这个类的实例,另外要有一个容器来保存生成的连接,在JAVA中,我们一般使用集合类型的对象,例如Vector,ArrayList都可以,但是考虑到多线程的安全性,我们一般使用Vector来进行封装,其中用到的代码片段如下:
首先定义一个名为ConnectionPool的类,里面用到的一系列属性和几个主要方法如下:
privateVectorpool;//Vector类型的连接池对象
privateStringurl;//数据库访问的url
privateStringusername;//数据库访问的用户名
privateStringpassword;//数据库的密码
privateStringdriver;//数据库的驱动类
privateintpoolSize;//连接池的大小,即连接的数量
privateintinitSize;//初始化连接的数量
privateintpoolSizeIncrement;//当连接数不够时的容量的增量
privatestaticConnectionPoolinstance=null;//定义一
文档评论(0)