《基于java数据库连接池的研究毕业论文(24页).docx》由会员分享,可在线阅读,更多相关《基于java数据库连接池的研究毕业论文(24页).docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于java数据库连接池的研究毕业论文-第 22 页本科毕业论文(设计)论文(设计)题目: 基于java数据库连接池的研究毕业论文(设计)原创性声明本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。 作者签名: 日期: 毕业论文(设计)授权使用说明本论文(设计)作者完全了解*学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。有权将
2、论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。学校可以公布论文(设计)的全部或部分内容。保密的论文(设计)在解密后适用本规定。 作者签名: 指导教师签名: 日期: 日期: 注 意 事 项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词 5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。3
3、.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用A4单面打印,论文50页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订3)其它摘 要在基于JDBC的数据库实际应用开发中,
4、对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作 多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。文章通过介绍 分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结一了些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和
5、容易,从实际上论证了这种设计方案的可行性。 关键词:连接池;数据库;JDBC;并发访问 ResearchandrealizationoftheDatabase ConnectionPoolAbstractInthepracticallyapplicationdevelopmentofdatabasebasedonJDBC,themanagementofdatabaseconnectionisakeypointandalsoadifficulty.TheresponseandperformanceoftheWEBsystemaredependedonfrequentlyconnecting,cl
6、osingandmulti-useraccessinginacertainextent.UsingtheDatabaseConnectionPoolcanprovidemanagementandmaintenanceforconnectionsofthedatabase.TheupperapplicationsmayaccessthedatabaserecourseviatheDatabaseConnectionPool,inordertoupgradesystemperformanceandfullyutilizethesystemrecourse.Thisarticlesummarizes
7、someissueswhicharefeasibilityofthisdesignprojectinpractice.Keywords:DatabaseConnectionPool;Database;JDBC; Concurrenceaccess 目 录1 引言11.1课程背景11.2连接池的主要作用11.3目前流行的WEB服务器数据库连接池方面使用现状1 1.3.1 DHCP介绍2 1.3.2 poolman介绍2 1.3.3 C3P0介绍2 1.3.4 其他连接池(自写连接池)22 相关理论基础32.1数据库概论32.2数据库连接池的基本原理32.3连接池中的关键技术4 2.3.1 连接池
8、的分配与释放4 2.3.2 连接池的维护53 系统总体设计思想及方案53.1连接池中的关键类设计63.2连接池中的管理机制73.3实现一个连接池的其他问题8 3.3.1 事务处理8 3.3.2 封装错误!未定义书签。 3.3.3 并发错误!未定义书签。 3.3.4 连接池的关闭错误!未定义书签。4 具体的设计流程和实现错误!未定义书签。4.1连接池的建立104.2连接池的管理124.3连接池的关闭144.4连接池的测试155 系统测试问题的总结155.1连接池的泄露问题15 5.1.1 产生现象15 5.1.2 解决办法165.2多数据库服务器问题176 总结19参考文献20谢 辞211 引言
9、 1.1 课题背景 随着信息技术的高速发展与广泛应用,数据库技术在信息技术领域中的位置越来越重要。传统的开发模式是:首先在主程序(如Servlet、Beans)中建立数据库连接;然后进行SQL操作,对数据库中的对象进行查询,修改和删除等;最后断开数据库连接。使用这种开发模式,对于一个简单的数据库应用,由于数据库的访问不是很频繁,只需要在访问数据库时创建一个连接,用完后就关闭它,这样做不会明显增大系统的开销但是对于一个复杂的数据库应用,情况就完全不同了,尤其是大型电子商务网站,同时可能有几百人基至几千人在线。在这种情况下,用户操作频繁的建立、关闭数据库,会极大的降低系统的性能,增大系统的开销,迫
10、使网站的响应速度下降,严重的甚至会造成服务器的崩溃。针对这些突出问题,采用运行速度更快,数据库访问效率更高的数据库连接池技术,以提高系统的运行效率将是至关重要的,因此本文提出了一种基于数据库连接池技术的有效解决方法。以加强对数据库操作的性能,改善资源使用率,提高应用程序的响应能力。 1.2连接池的主要作用 一个应用系统,同时有几百人县至几千人频繁的进行数据库连接操作势必占用很多的系统资源,严重的基至会造成服务器的崩溃。对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,如果不能控制被创建的连接对象数,系统资源会
11、被毫无顾及的分配出去,连接过多也可能导致内存泄漏,服务器崩溃。针对这些突出问题,因此提出 了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。 1.3目前流行的web服务器数据库连接池方面使用现状 由于JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如WebLogic、Websphere等都自带有连接池。不同的是,tomcat并没有自已发连接池,而是集成的apache
12、的另外一个开源项目DBCP连接池。BEA的WebLogic自身带有一个连接池,这个连接池无法与WebLogic分离,但是也必须有其第三方的专用类方法支持连接池的用法,而不需要用户再去写一个连接池。以下是一些第三方连接池: 1.3.1DHCP介绍 DBCP应Apache的Jakarta组织开发,是目前使用较为广泛的一个连接池,一是因为tomcat自带的就是这个连接池,二是因为开源免费。由于其使用的稳定性不是很好,普名的开源项目hibernate不再提供对它的支持。DBCP部分参数说明如下: datasource:要连接的datasource(通常我们不会定义在 server.xml)。defau
13、ltAutocommit:对于事务是否autocommit,默认值为true。 defaultReadonly:对于数据库是否只能读取,默认值为false。 driverclassName:连接数据库所用的JDBCDriverClass。maxActive:最大连接数据库连接数,设0为没有限制。 maxldle:最大等待连接中的数量,设0为没有限制。 maxwait:最大等待秒数,单位为ms,超过时间会出错误信息。 password:登陆数据库所用的密码。 url:连接数据库的URL。 username:登陆数据库所用的帐号。 validationQuery:验证连接是否成功,SQLSELEC
14、T指令至少要返回一行。 removeAbandoned:是否自我中断,默认是false。 removeAbandonedTimeout:几秒后会自我中断,removeAbandoned必须为true。IogAbandoned:是否记录中断事件,默认为false。 1.3.2Poolman介绍 Poolman连接池前几年应用较广泛现在应用相对较少。配置步骤主要是先在/项日名称/web-Inf/下加入一jar包,然后配置一个xml文件,文件属性类似于DBCP,最后在程序中写出调用该连接池的方法。 1.3.3C3PO介绍 C3PO是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate
15、一起发布,包括了实现JDBC3.0和JDBC2.0扩展规范说明的Connection和Statement池的Datasource对象。自从hibemate自带了c3po以后,c3po很快就受到了广大程序员的认可,其性能上来说比DBCP要好的多。 1.3.4其他连接池(自写连接池) 有些程序员喜欢自己写连接池,建议不用这样的方法,因为连接池的管理较为复杂,自己写常出现各种各样的错误,推荐使用有成熟技术的连接池,同时也方便系统的移植。2 相关理论基础 2.1 数据库概述 数据库,顾名思义,是存人数据的仓库。只不过这个仓库是在计算机存储设备上的,而且数据是按一定格式存放的。 当人们收集了大量的数据后
16、,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息。当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源。 要是下定义的话,就应该是:指长期储存在计算机内的,有组织的,可共享的数据集合。 数据库包含关系数据库,面向对象数据库及新兴的XML数据库等多种,目前应用最广泛的是关系数据库,若在关系数据库基础上提供部分面向对象数据库功能的对象关系数据库。在数据库技术的早期还曾经流行过层次数据库与网状数据库,但这两类数据库目前已经极少使用。 2.2数据库连接池的基本原理 建立“缓冲存储池”,是数据库
17、连接池的基本设计思想。这种技术类似于CPU中的Cache技术,将预先设定好的数据库连接放入该缓冲池中,当要建立数据库连接操作时,便从池中取出一个连接,使用完毕后再将其放回。这样就达到了连接复用的目的,应用程序重复使用一个数据库连接,在多层结构的应用程序中通过连接池技术可以使系统的性能明显得到提到。最为关键的是,该方法避免了对数据库连接的频繁建立、关闭,减小了系统开销,提高了响应速度。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据。数据库连接池属于应用程序对底层的调用,用户
18、并发访问应用程序时会提交访问请求,然后通过线程来处理这些请求,并向连接池申请一个对数据库操作的连接,操作完毕后将连接释放。应用程序调用连接池连接的基本工作原理如下图所示: 基于以上原理,连接池的建立会在后面章节中做具体描述。为了方便理解,连接池以JSP页面形式将最大连接数的设置、连接池的使用、超时等待、连接池的关闭等情况展示出来,给用户一个更为直观的感受。连接的调用原理如下图所示: 从图中可以看出当程序(JSP.Servlet.JavaBean)中需要数据库连接时,只需从内存中取出一个来,并将这个取得的连接加入Vector中,而不用新建连接;使用完毕后放回内存中,并将Vector中的已用连接删
19、除。 2. 3 连接池中的关键技术 2.3.1连接池的分配与释放 连接池的分配与释放技术对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。对于连接的管理。每当用户请求一个连接时,系统首先检查连接池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,若不可用就把这个连接删掉,重新检测是否还有连接);如果检查到当前所开连接池没有达到连接池所允许的最大连接数(maxconn),就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果
20、在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)系统对已经分配出去正在使用的连接只做计数。2.3.2连接池的维护 数据库连接池到底要放置多少个连接,这是个配置策略。为了使系统的性能达到最佳状态,连接池中的连接数的设定显得尤为重要,我们采用设置最大连接数(maxconn)和最小连接数(minconn)的方式来解决这一问题。所谓最大连接数,即连接池中允许连接的最大数目,然后,最大连接数的设定要通过具体的应用需求来给出一个连接池可以承受的最大连接数目的最佳点。如果应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被
21、加入到等待队列中,等待其他连接的释放后再来调用一空闲连接(freeconn),这样可能会影响部分对数据厍的操作。所谓最小连接数,即应用启动前,已经预先创建好的连接数。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。如果最小连接数过大,么系统启动过程将变慢,若应用程序对数据库的访问量不大,过多的数据库连接资源将被浪费,但是系统启动后响应更快;如果过小系统启动将加快,但是最初使用的用户会因为连接池中没有足够的连接而会发送一个新的数据库连接请求,将不可避免的延缓执行速度。 3系统总体设计思想及方案 数据库连接池技术的设计思想非常简单,先将数据库连接作为对象存储在一个Vect
22、or对象中,Vector类可以实现可增长的对象“数组”。Vector的大小可以根据需要增大或缩小,以适应创建Vector后进行添加或移除项的操作。这里主要包含使用的连接(nowconnections)和未使用的连接(freeconnections)两个Vector类创建的对象,创建Vector对象的方法如下: publicDBConnectionpool(vectorconnections) freeconnections = newVectoro(); nowconnections=newVector(); 当外部程序向数据库申请建立连接后系统会调用nowconnections.add()方
23、法,此时已用连接计数器加1,相应的,调用freeconnections.Removei()方法,此时空闲连接计数器减1,对于这样的引用计数法将会在后面的章节中具体描述。这样,不同的数据库访问请求就可以共享这些连接,并通过复用这些已经建立的数据库连接,克服传统开发模式对数据库操作的缺点。另外,采用超时判断(timeout)机制,等待应用程序对连接的释放或者调用Connection.close()方法主动释放连接,能极大地节省系统资源和用户等待时间。而实现连接池时,当应用程序调用Connection.close()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据库物理连
24、接(DBConnectionPool对象)进行重用。为了使连接池实现模块能得到这种“通告”,连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注册成为DBConnectionPool对象的监听者。连接池实现模块接受到此通告后,不是真正意义上的物理奖闭、而是将DBConnectionPool对象返回到池中进行重用。从上面的介绍,可以看出连接池技术的关键就是其自身的管理机制,结合连接池工作的基本原理,通过下图展现出一个连接池系统的总体设计框架。 3.1连接池中的关键类设计 一个连接池应用的设计,需要几个关键部分作为支撑,其中最为重要的是DBConnectionP
25、ool类和DBConnectionManager类,他们对连接的建立、管理、释放起决定性作用。大体作用列举如下: 1.一个DBConnectionpool类,该类负责从连接池获取(或创建)连接、将连接返回给连接池、空闲连接的超时等待、系统关闭时释放所有资源并关闭所有连接。 2.Datasourceproviderservlet类,该类负责通过上下文环境读取配置文件后装载和注册JDBC驱动、数据库名等。 3.一个DBConnectionManager类,该类负责按预先指定的最大连接池数连初始化连接池、创建DBConnectionpool对象provider.当所有的连接客户退出后,关闭全部连接。
26、4.DBconfig.properties属性文件,该文件中包含了数据库驱动(DriverName)、数据库URL、数据库表空间名(User)、表空间密码(Passwold)、连接池最大连接数(maxconnections) 5、即为应用程序对连接池中的连接的调用和释放,应用程序退出后连接池的关闭。将以上5个部分串连起来,即是本连接池的简单设计流程。首先应用程序向连接池申请连接,就需要通过DBConnectionpool类,DBConnectionManager类对连接池初始化并且还需要Datasourceproviderservlet类的帮助读取DBconfig.prope西es文件中的属性
27、,加载和注册JDBC驱动,数据库名等,连接池才能初始化成功。之后通过DBConnectionPool类监视,管理应用程序调用,释放的数据库连接,并通过该类的cp对象将连接使用情况反映在页面上。连接池管理程序得到某个连接,而其他线程就不会得到这个数据库连接了,此线程使用结束后,该线程将连接交还给连接池管理程序,以分配给其他等待连接的请求线程。这里连接池充分利用Java的线程同步机理,使当前服务线程处于等待状态,直至有空闲的连接出现。最后当应用程序退出时,通过DBConnectionManager类负责连接池的关闭。 3.2连接池中的管理机制 应用程序开发中“三分技术、七分管理”的思想在连接池的配
28、置中同样得以体现,如何从连接池中取得连接,何时释放连接、如何释放连接等问题还需要为连接池配置更为复杂的管理机制,连接池流程的管理如下图所不,这些属性定义了连接池与其中每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。 3.2.1事务处理 前面讨论的是关于使用数据库连接进行普通的数据库访问。对于事务处理,情况就变得比较复杂。因为事务本身要求原则性的保证,此时就要求对于数据库的操作符合要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操
29、作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。Connectio日本身具有提供了对于事务的支持,可以通过设置Connection的Autocommit属性为false,显式的调用commit或roHback 方法来实现。但是要安全、高效的进行连接复用,就必须提供相应的事务支持机制。方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性,并且又不会妨碍连接的复用。 连接管理服务提供了显式的事务开始结束(commit或o11back)声明,以及一个事务注册表,用于登事务发起者和事务使用的连接的对应关系,通过该表,使用事务的部分和连接管理部分
30、就隔离开,因为该表是在运行时根据实际的调用情况动态生成的。事务使用的连接在该事务运行中不能被复用。在实现中,用户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表,使用已经分配的连接来完成的。当事务结束时,从注册表中删除相应表项。 3.2.2封装 从上面的论述可以看出,普通的数据库方法和事务方法对于连接的使用(分配,释放)是不同的,为了便于使用,对外提供一致的操作接口对连接进行了封装:普通连接和事务连接,并利用了Java中的强大的面向对象特性;多态。普通连接和事务连接均实现了一个DBConnection接口,对于接口中定义的方法,分别根据自己的特点作了不同的实现
31、,这样在对于连接的处理上就非常的一致了。 3.2.3并发 为了使连接管理服务有更大的通用性,我们必须要考虑到多线程环境,即并发问题。在一个多线程的环境下,必须要保证连接管理自身数据的一致性和连接内部数据的一致性,(synchronized关键字),这样就很容易使连接管理成为线程安全的。 对于并发访问,所有的当前请求都将被连接池管理程序按顺序锁定。对请求线程的锁定是通过应用程序代码进行的,且请求数量可以很大,不必担心超出缓冲容量限制。一旦将连接交还给连接池,该连接将由连接池管理程序分配给其他锁定的请求。当有很多数据库请求并超出了连接池中连接的数目时,只有先发出数据库请求的线程获得连接来访问数据库
32、,其他连接暂时处于等待的锁定状态,当线程完成数据库操作并释放连接后,被释放的连接将按顺序由其他线程获得,这样就可以大大节省服务器的资源。 3.2.4连接池的关闭 很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用Connection.closeo方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点: 第一:改变了用户使用习惯,增加了用户的使用难度。使用者在用完数据库连接后通常是直接调用连接的close方法来释放数据库资源。 第二:使连接池无法对
33、之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,么连接池将无法正常维护所有连接的状态。 4 具体的设计流程和实现 4.1 连接池的建立 应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提了很多容器类可以方便的构建连接池,如:Vector.Stack.Servlet.Bean等,通过读取连接属性文件DBconfig.properties与数据库实例建立连接。(该属性文件中包含了连接数据库的URL、数据库驱动、数据库表空间、数据库表
34、空间密码、连接池最大连接数)在系统初始化时,根据相应的配置创建连接并放置在连接池中,这些对象作为系统可分配的自由连接,以后所使用的连接都是从连接池中获得,这样就避免了随意建立连接,关闭连接所带来的资源浪费。连接池初始化如下:publicDBConnectionpool(vectorconnections)Freeconneetions=newVector(); nowconnections=newVector(); freeconnections = connections; maxconnections= freeconnections.Size(); 本连接池的建立使用输入流,通过上下文环
35、境,读取配置文件(Dbconfig.Prooperties)里预先设置的参数,部分代码如下:publicvoidcontextlnitialized(servletcontextEventevent) PropertiesProperties(); Vectorconnections=newVector(); Servletcontextcontext=event.Getservletcontext();try /使用输入流:读取配置文件里的各种参数Inputstreaminputgetclasso.GetResourceAsstream(/DBconfig.properties);ps.Io
36、ad(input);input.closeo;url=(String)ps.Get(url);User = (String)ps.Get(use);password= (String) ps.Get(password);DriverName=(string)ps.Get(DriverName);maxconnections = Integer.parselnt(String)ps.Get(maxconnections).Trim(),10);System.out.println(user); /循环加入取得的连接到vector中for (int i=0;imaxconnections ; i+
37、) /调用下面的方法,取得数据库连接,并放入到Vector中connections. Add(getconnection( url, user, password, DriverName) : catch(Exceptione)e.printstackTrace();/放到服务器的上下文环境中context.setAttribute(CONNECTOR,newDBConnectionpool(connections) ;连接池初始化参数通过页面设置写入DBconfig.propeties文件中,如下图所示: 4.2连接池的管理 连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的
38、连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配,释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配,释放策略。 连接池的分配,释放策略对于有效复用连接非常重要。就一般情况而言,当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minconn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。我们采用的方
39、法是一个很有名的设计模式:ReferenceCounting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是: publicsynchronizedConnectiongetconnection(intTimeout) Connectioncon = null; if(freeconnections.Size()=O) System.out.println(”连接失败,由于数据库连接池中无可用连接!请等待!”);try newDBConnectionManagero.clo
40、seAll(); catch(Exceptionex) ex.printstackTraceo; returncon;elseConnectiontemp = (Connection)freeconnections.FirstElement();freeConnections.remove(temp);nowConnections.add(temp);returntemp; 当应用程序向数据库发起连接请求时,会检查连接池中是否存在空闲的连接。如果存在空闲的连接,连接池则把空闲连接分配给客户,并将该连接做相应处理,即标记为正在使用的连接,并将引用计数加1。如果不存在空闲连接,则检查连接池里的连接
41、数是否已经达到了最大连接数(maxconn),若没有达到就为应用程序创建一个新的谇榕;若达到了最大连接数,么就需要等待连接的释放,等待连接的释放时间是由系统中预先定义好的一个超时参数(Timeout)来做判断。如果在超时等待(Timeout)后仍没有可用的空间连接工程序上便会返回一个null值,同时抛出无空闲连接的异常给用户。publicvoidTimeout(intTimeout,Connectioncon)tryThreadt=newThreado;t.Start();t.Run();t.wait(Timeout);closeconnection(con);t.Destroy();catc
42、h(Exceptionex) ex.printstackTrace(); 已用连接计数器的问题交由JSP页面中的循环来处理,每当应用程序申请一个连接时,计数器便会循环一次,部分实现代码如下:for(int= 0; i cp.GetNowconnectionso.sizeo;i+) out.println(连接名称”+(i+1)+”:/font”+cp.GetNowconnections().Get(i)+“);con=(Connection)cp.GetNowconnections().Get(0);对于未用连接的处理与已用连接类似,部分实现代码如下:for(int=cp.Getfreecon
43、nections().size();j+)out.println(未用连接名称”+Li+1)+”:/font”+cp.Getfreeconnections().Get(j)+“);连接池的调用如下图所示,若连接已分配完毕,系统提示等待连接释放。 4.3连接池的关闭 当应用程序退出时,通过调用closeAll()方法来关闭连接池中的连接,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接)。publicvoidcloseAllo try if(rs!=null)rs.closeo; if(smt!=null)smt.closeo; if(psmt!=null)ps
44、mt.closeo; if(con!=null)provider.closeconnection(con);catch(Exceptione)e.printstackTrace(); 4.4连接池的测试 对于一个好的连接池,性能显得尤为重要。性能不仅仅体现的是对数据库操作的处理速度还有连接池自身的稳定性。通过压力测试,对比能够看出DBCP连接池要比Hibernate3.0默认自带的数据库连接池c3po快,但是稳定性却不如它,并发用户过多常常会自动断开连接。通过对本连接池的测试发现,有连接池的时候对数据库的操作要比没有连接池的时候快3-5秒。 一般数据库连接池采用DBCP作为连接池时,默认的初始化为50个,速度不会有太大问题。正常情况下,系统没问题,压力测试从10个并发开始,每一次增量是增加10个