基于java数据库连接池的研究_第1页
基于java数据库连接池的研究_第2页
基于java数据库连接池的研究_第3页
基于java数据库连接池的研究_第4页
基于java数据库连接池的研究_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业论文(设计)论文(设计)题:基于java数据库连接池的研究学院:数学与统计学院专业名称:信息与计算科学摘要在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作·多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。文章通过介绍·分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结一了些数据库连接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易,从实际上论证了这种设计方案的可行性。关键词:连接池;数据库;JDBC;并发访问

Research

and

realization

of

the

Database

Connection

Pool

Abstract

In

the

practically

application

development

of

database

based

on

JDBC,

the

management

of

database

connection

is

a

key

point

and

also

a

difficulty.

The

response

and

performance

of

the

WEB

system

are

depended

on

frequently

connecting,

closing

and

multi-user

accessing

in

a

certain

extent.

Using

the

Database

Connection

Pool

can

provide

management

and

maintenance

for

connections

of

the

database.

The

upper

applications

may

access

the

database

recourse

via

the

Database

Connection

Pool,

in

order

to

upgrade

system

performance

and

fully

utilize

the

system

recourse.

This

article

summarizes

some

issues

which

are

feasibility

of

this

design

project

in

practice.

Key

words

:

Database

Connection

Pool

;

Database

;

JDBC

;

Concurrence

access

目录1引言 11.1 课程背景 11.2 连接池的主要作用 11.3 目前流行的WEB服务器数据库连接池方面使用现状 11.3.1DHCP介绍 21.3.2poolman介绍 21.3.3C3P0介绍 21.3.4其他连接池(自写连接池) 22相关理论基础 32.1 数据库概论 32.2 数据库连接池的基本原理 32.3 连接池中的关键技术 42.3.1连接池的分配与释放 42.3.2连接池的维护 53系统总体设计思想及方案 53.1 连接池中的关键类设计 63.2 连接池中的管理机制 73.3 实现一个连接池的其他问题 83.3.1事务处理 83.3.2封装 93.3.3并发 93.3.4连接池的关闭 94具体的设计流程和实现 104.1 连接池的建立 104.2 连接池的管理 124.3 连接池的关闭 144.4 连接池的测试 155系统测试问题的总结 155.1 连接池的泄露问题 155.1.1产生现象 155.1.2解决办法 165.2 多数据库服务器问题 176总结 19参考文献 20谢辞 211引言

1.1课题背景

随着信息技术的高速发展与广泛应用,数据库技术在信息技术领域中的位置越来越重要。传统的开发模式是:首先在主程序(如Servlet、Beans)中建立数据库连接;然后进行SQL操作,对数据库中的对象进行查询,修改和删除等;最后断开数据库连接。使用这种开发模式,对于一个简单的数据库应用,由于数据库的访问不是很频繁,只需要在访问数据库时创建一个连接,用完后就关闭它,这样做不会明显增大系统的开销但是对于一个复杂的数据库应用,情况就完全不同了,尤其是大型电子商务网站,同时可能有几百人基至几千人在线。在这种情况下,用户操作频繁的建立、关闭数据库,会极大的降低系统的性能,增大系统的开销,迫使网站的响应速度下降,严重的甚至会造成服务器的崩溃。针对这些突出问题,采用运行速度更快,数据库访问效率更高的数据库连接池技术,以提高系统的运行效率将是至关重要的,因此本文提出了一种基于数据库连接池技术的有效解决方法。以加强对数据库操作的性能,改善资源使用率,提高应用程序的响应能力。

1.2连接池的主要作用

一个应用系统,同时有几百人县至几千人频繁的进行数据库连接操作势必占用很多的系统资源,严重的基至会造成服务器的崩溃。对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,如果不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,连接过多也可能导致内存泄漏,服务器崩溃。针对这些突出问题,因此提出了一种基于数据库连接池技术的有效解决方法。简而言之,数据库连接池主要作用是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

1.3目前流行的web服务器数据库连接池方面使用现状

由于JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如WebLogic、Websphere等都自带有连接池。不同的是,tomcat并没有自已发连接池,而是集成的apache的另外一个开源项目DBCP连接池。BEA的WebLogic自身带有一个连接池,这个连接池无法与WebLogic分离,但是也必须有其第三方的专用类方法支持连接池的用法,而不需要用户再去写一个连接池。以下是一些第三方连接池:1.3.1DHCP介绍

DBCP应Apache的Jakarta组织开发,是目前使用较为广泛的一个连接

池,一是因为tomcat自带的就是这个连接池,二是因为开源免费。由于其使用的稳定性不是很好,普名的开源项目hibernate不再提供对它的支持。DBCP部分参数说明如下:

datasource:要连接的datasource(通常我们不会定义在server.

xml)。defaultAutocommit:对于事务是否autocommit,默认值为true。

defaultReadonly:对于数据库是否只能读取,默认值为false。

driverclassName:连接数据库所用的

JDBC

Driver

Class。maxActive:最大连接数据库连接数,设0为没有限制。

maxldle:最大等待连接中的数量,设0为没有限制。

maxwait:最大等待秒数,单位为ms,超过时间会出错误信息。

password:登陆数据库所用的密码。

url:连接数据库的URL。

username:登陆数据库所用的帐号。

validationQuery:验证连接是否成功,SQL

SELECT指令至少要返回一行。removeAbandoned:是否自我中断,默认是false。

removeAbandonedTimeout:几秒后会自我中断,removeAbandoned必

须为true。IogAbandoned:是否记录中断事件,默认为false。

1.3.2Poolman介绍

Poolman连接池前几年应用较广泛现在应用相对较少。配置步骤主

要是先在/项日名称/web-Inf/下加入一jar包,然后配置一个xml文件,文

件属性类似于DBCP,最后在程序中写出调用该连接池的方法。

1.3.3C3PO介绍

C3PO是一个开放源代码的JDBC

连接池,它在lib目录中与Hibernate一

起发布,包括了实现JDBC3.0和JDBC2.0扩展规范说明的Connection

和Statement池的Datasource对象。自从hibemate自带了c3po以后,c3po很快就受到了广大程序员的认可,其性能上来说比DBCP要好的多。1.3.4其他连接池(自写连接池)

有些程序员喜欢自己写连接池,建议不用这样的方法,因为连接池的

管理较为复杂,自己写常出现各种各样的错误,推荐使用有成熟技术的连接

池,同时也方便系统的移植。

2相关理论基础

2.1数据库概述

数据库,顾名思义,是存人数据的仓库。只不过这个仓库是在计算机

存储设备上的,而且数据是按一定格式存放的。当人们收集了大量的数据后,应该把它们保存起来进入近一步的处理,进一步的抽取有用的信息。当年人们把数据存放在文件柜中,可现在随着社会的发展,数据量急剧增长,现在人们就借助计算机和数据库技术科学的保存大量的数据,以便能更好的利用这些数据资源。要是下定义的话,就应该是:指长期储存在计算机内的,有组织的,可共享的数据集合。

数据库包含关系数据库,面向对象数据库及新兴的XML数据库等多种,目前应用最广泛的是关系数据库,若在关系数据库基础上提供部分面向对象数据库功能的对象关系数据库。在数据库技术的早期还曾经流行过层次数据库与网状数据库,但这两类数据库目前已经极少使用。

2.2数据库连接池的基本原理建立“缓冲存储池”,是数据库连接池的基本设计思想。这种技术类似于CPU中的Cache技术,将预先设定好的数据库连接放入该缓冲池中,当要建立数据库连接操作时,便从池中取出一个连接,使用完毕后再将其放回。这样就达到了连接复用的目的,应用程序重复使用一个数据库连接,在多层结构的应用程序中通过连接池技术可以使系统的性能明显得到提到。最为关键的是,该方法避免了对数据库连接的频繁建立、关闭,减小了系统开销,提高了响应速度。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量,使用情况,为系统开发,测试及性能调整提供依据。数据库连接池属于应用程序对底层的调用,用户并发访问应用程序时会提交访问请求,然后通过线程来处理这些请求,并向连接池申请一个对数据库操作的连接,操作完毕后将连接释放。应用程序调用连接池

连接的基本工作原理如下图所示:基于以上原理,连接池的建立会在后面章节中做具体描述。为了方便理解,连接池以JSP页面形式将最大连接数的设置、连接池的使用、超时等待、连接池的关闭等情况展示出来,给用户一个更为直观的感受。连接的调用原理如下图所示:从图中可以看出当程序(JSP.

Servlet.

Java

Bean)

中需要数据库连接时,只需从内存中取出一个来,并将这个取得的连接加入Vector中,而不用新建连接;使用完毕后放回内存中,并将Vector中的已用连接删除。2.3连接池中的关键技术2.3.1连接池的分配与释放

连接池的分配与释放技术对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。对于连接的管理。每当用户请求一个连接时,系统首先检查连接池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,若不可

用就把这个连接删掉,重新检测是否还有连接);如果检查到当前所开连接池没有达到连接池所允许的最大连接数(maxconn),就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)

系统对已经分配出去正在使用的连接只做计数。2.3.2连接池的维护数据库连接池到底要放置多少个连接,这是个配置策略。为了使系统的性能达到最佳状态,连接池中的连接数的设定显得尤为重要,我们采用设置最大连接数(maxconn)和最小连接数(minconn)的方式来解决这一问题。所谓最大连接数,即连接池中允许连接的最大数目,然后,最大连接数的设定要通过具体的应用需求来给出一个连接池可以承受的最大连接数目的最佳点。如果应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中,等待其他连接的释放后再来调用一空闲连接(freeconn),这样可能会影响部分对数据厍的操作。所谓最小连接数,即应用启动前,已经预先创建好的连接数。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。如果最小连接数过大,么系统启动过程将变慢,若应用程序对数据库的访问量不大,过多的数据库连接资源将被浪费,但是系统启动后响应更快;如果过小系统启动将加快,但是最初使用的用户会因为连接池中没有足够的连接而会发送一个新的数据库连接请求,将不可避免的延缓执行速度。3

系统总体设计思想及方案

数据库连接池技术的设计思想非常简单,先将数据库连接作为对象存储在一个Vector对象中,Vector类可以实现可增长的对象“数组”。Vector

的大小可以根据需要增大或缩小,以适应创建Vector后进行添加或移除项的操作。这里主要包含使用的连接(nowconnections)和未使用的连接(freeconnections)

两个

Vector

类创

建的对象,创建Vector对象的方法如下:

public

DBConnectionpool(vector

connections){

freeconnections=new

Vectoro();nowconnections

=

new

Vector();

}当外部程序向数据库申请建立连接后系统会调用nowconnections.add()方法,此时已用连接计数器加1,相应的,调用freeconnections.Removei()方法,此时空闲连接计数器减1,对于这样的引用计数法将会在后面的章节中具体

描述。这样,不同的数据库访问请求就可以共享这些连接,并通过复用这些已经建立的数据库连接,克服传统开发模式对数据库操作的缺点。另外,采用超时判断(timeout)机制,等待应用程序对连接的释放或者调用Connection.close()方法主动释放连接,能极大地节省系统资源和用户等待时间。而实现连接池时,当应用程序调用Connection.close()试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据库物理连接(DBConnectionPool

对象)进行重用。为了使连接池实现模块能得到这种“通告”,连接池实现模块必须实现ConnectionEventListener

接口,而且同时需要注册成为DBConnectionPool

对象的监听者。连接池实现模块接受到此通告后,不是真正意义上的物理奖闭、而是将DBConnectionPool对象返回到池中进行重用。从上面的介绍,可以看出连接池技术的关键就是其自身的管理机制,结合连接池工作

的基本原理,通过下图展现出一个连接池系统的总体设计框架。3.1连接池中的关键类设计

一个连接池应用的设计,需要几个关键部分作为支撑,其中最为重要

的是DBConnectionPool类和DBConnectionManager类,他们对连接的建立、管理、释放起决定性作用。大体作用列举如下:

1.一个DBConnectionpool类,该类负责从连接池获取(或创建)连接、将连接返回给连接池、空闲连接的超时等待、系统关闭时释放所有资源并关闭所有连接。

2.Datasourceproviderservlet类,该类

负责通过上下文环境读取配置文件后装载和注册JDBC驱动、数据库名等。

3.一个DBConnection

Manager

类,该类负责按预先指定的最大连接

池数连初始化连接池、创建DBConnectionpool对象provider.当

所有的连接客户退出后,关闭全部连接。4.DBperties属性文件,该文件中包含了数据库驱动(DriverName)、数据库URL、数据库表空间名(User)、表空间密码(Passwold)、连接池最大连接数(maxconnections)

5、即为应用程序对连接池中的连接的调用和释放,应用程序退出后连接池的关闭。将以上5个部分串连起来,即是本连接池的简单设计流程。首先应用程序向连接池申请连接,就需要通过DBConnectionpool类,DBConnectionManager类对连接池初始化并且还需要Datasourceproviderservlet类的帮助读取DBpe西es文件中的属性,加载和注册JDBC驱动,数据库名等,连接池才能初始化成功。之后通过DBConnectionPool类监视,管理应用程序调用,释放的数据库连接,并通过该类的cp对象将连接使用情况反映在页面上。连接池管理程序得到某个连接,而其他线程就不会得到这个数据库连接了,此线程使用结束后,该线程将连接交还给连接池管理程序,以分配给其他等待连接的请求

线程。这里连接池充分利用Java的线程同步机理,使当前服务线程处于等待状态,直至有空闲的连接出现。最后当应用程序退出时,通过DBConnectionManager类负责连接池的关闭。3.2连接池中的管理机制应用程序开发中“三分技术、七分管理”的思想在连接池的配置中同样得以体现,如何从连接池中取得连接,何时释放连接、如何释放连接等问题还需要为连接池配置更为复杂的管理机制,连接池流程的管理如下图所不,这些属性定义了连接池与其中每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。3.2.1事务处理前面讨论的是关于使用数据库连接进行普通的数据库访问。对于事务处理,情况就变得比较复杂。因为事务本身要求原则性的保证,此时就要求对于数据库的操作符合要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。Connectio日本身具有提供了对于事务的支持,可以通过设置Connection的Autocommit属性为false,显式的调用commit或roHback方法来实现。但是要安全、高效的进行连接复用,就必须提供相应的事务支持机制。方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性,并且又不会妨碍连接的复用。

连接管理服务提供了显式的事务开始结束(commit或「o11back)声明,以及一个事务注册表,用于登事务发起者和事务使用的连接的对应关系,通过该表,使用事务的部分和连接管理部分就隔离开,因为该表是在运行时根据实际的调用情况动态生成的。事务使用的连接在该事务运行中不能被复用。在实现中,用户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表,使用已经分配的连接来完成的。当事务结束时,从注册表中删除相应表项。3.2.2封装

从上面的论述可以看出,普通的数据库方法和事务方法对于连接的使用(分配,释放)是不同的,为了便于使用,对外提供一致的操作接口对连接进行了封装:普通连接和事务连接,并利用了Java中的强大的面向对象特性;多态。普通连接和事务连接均实现了一个DBConnection接口,对于接口中定义的方法,分别根据自己的特点作了不同的实现,这样在对于连接的处理上就非常的一致了。

3.2.3并发

为了使连接管理服务有更大的通用性,我们必须要考虑到多线程环境,即并发问题。在一个多线程的环境下,必须要保证连接管理自身数据的一致性和连接内部数据的一致性,(synchronized关键字),这样就很容易使连接管理成为线程安全的。对于并发访问,所有的当前请求都将被连接池管理程序按顺序锁定。对请求线程的锁定是通过应用程序代码进行的,且请求数量可以很大,不必担心超出缓冲容量限制。一旦将连接交还给连接池,该连接将由连接池管理程序分配给其他锁定的请求。当有很多数据库请求并超出了连接池中连接的数目时,只有先发出数据库请求的线程获得连接来访问数据库,其他连接暂时处于等待的锁定状态,当线程完成数据库操作并释放连接后,被释放的连接将按顺序由其他线程获得,这样就可以大大节省服务器的资源。

3.2.4连接池的关闭

很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用Connection.closeo方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:

第一:改变了用户使用习惯,增加了用户的使用难度。使用者在用完数据库连接后通常是直接调用连接的close方法来释放数据库资源。

第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,么连接池将无法正常维护所有连接的状态。

4具体的设计流程和实现

4.1连接池的建立应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连

接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提了很多容器类可以方便的构建连接池,如:Vector.Stack.Servlet.Bean等,通过读取连接属性文件DBperties与数据库实例建立连接。(该属性文件中包含了连接数据库的URL、数据库驱动、数据库表空间、数据库表空间密码、连接池最大连接数)在系统初始化时,根据相应的配置创建连接并放置在连接池中,

这些对象作为系统可分配的自由连接,以后所使用的连接都是从连接池中获得,这样就避免了随意建立连接,关闭连接所带来的资源浪费。

连接池初始化如下:

publicDBConnectionpool(vectorconnections){Freeconneetions

=

new

Vector();

nowconnections

=

new

Vector();

freeconnections=connections;

maxconnections

=freeconnections.Size()

;

}

本连接池的建立使用输入流,通过上下文环境,读取配置文件

(Dbconfig.Prooperties)里预先设置的参数,部分代码如下:

public

void

contextlnitialized(servletcontextEvent

event)

{Properties

Properties();

Vector

connections

=

new

Vector();

Servletcontext

context

=

event.

Getservletcontext();

try

{//使用输入流:读取配置文件里的各种参数

Inputstream

inputgetclasso.

GetResourceAsstream("/

DBconfig.

properties")

;

ps.

Ioad

(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(inti=0;i<maxconnections;i++){//调用下面的方法,取得数据库连接,并放入到Vector中connections.Add(getconnection(url,user,password,DriverName)):}}catch

(Exception

e)

{e.

printstackTrace()

;

}//放到服务器的上下文环境中context.setAttribute("CONNECTOR",new

DBConnectionpool(connections));}连接池初始化参数通过页面设置写入DBpeties文件中,如下图所示:4.2连接池的管理连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配,释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配,释放策略。连接池的分配,释放策略对于有效复用连接非常重要。就一般情况而言,当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minconn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。我们采用的方法是一个很有名的设计模式:ReferenceCounting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是:

public

synchronized

Connection

getconnection(int

Timeout)

{

Connection

con=null

;

if

(freeconnections.Size()

<=

O)

{

System.out.println(”连接失败,由于数据库连接池中无可用连接!请

等待!”);try

{

new

DBConnection

Managero.

closeAll();

}

catch

(Exception

ex)

{

ex.

printstackTraceo

;

}

return

con

;

}else

{

Connection

temp=(Connection)

freeconnections.FirstElement();

freeConnections.remove(temp)

;

nowConnections.add(temp)

;

return

temp

;

}}

当应用程序向数据库发起连接请求时,会检查连接池中是否存在空闲

的连接。如果存在空闲的连接,连接池则把空闲连接分配给客户,并将该连接做相应处理,即标记为正在使用的连接,并将引用计数加1。如果不存在空闲连接,则检查连接池里的连接数是否已经达到了最大连接数(maxconn),若没有达到就为应用程序创建一个新的谇榕;若达到了最大连接数,么就需要等待连接的释

放,等待连接的释放时间是由系统中预先定义好的一个超时参数(Timeout)来做判断。如果在超时等待(Timeout)后仍没有可用的空间连接工程序上便会返回一个null值,同时抛出无空闲连接的异常给用户。

public

void

Timeout(int

Timeout,

Connection

con)

{

try

{

Thread

t

=

new

Threado

;

t.Start();

t.Run();

t.wait(Timeout);

closeconnection

(con)

;

t.

Destroy();

}catch

(Exception

ex)

{ex.

printstackTrace();}}

已用连接计数器的问题交由JSP

页面中的循环来处理,每当应用程序申请一个连接时,计数器便会循环一次,部分实现代码如下:

for

(int

=0;i<cp.GetNowconnectionso.sizeo;i++)

{

out.

println("<font

color=blue>

连接名称”+(i+1)+”:〈/font〉”+

cp.GetNowconnections().Get(i)

+

“<br>")

;

con

=

(Connection)

cp.

GetNowconnections().Get

(0);

}

对于未用连接的处理与已用连接类似,部分实现代码如下:

for

(int

=

cp.Getfreeconnections().size();j++)

{out.

println("<font

cOlor=blue>

用连接名称”+Li+1)+”:〈/font〉”+

cp.Getfreeconnections().Get(j)

+“<br>")

;

}

连接池的调用如下图所示,若连接已分配完毕,系统提示等待连接释放。

4.3连接池的关闭

当应用程序退出时,通过调用closeAll()方法来关闭连接池中的连接,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即

关闭所有数据库连接)。

public

void

closeAllo

{

try

{

if

(rs

!=

null)

rs.

closeo

;

if

(smt

!=

null)

smt.

closeo

;

if

(psmt

!=

null)

psmt.

closeo

;

if(con

!

=

null)provider.

closeconnection

(con)

;

}

catch

(Exception

e)

{

e.

printstackTrace()

;

}}

4.4连接池的测试

对于一个好的连接池,性能显得尤为重要。性能不仅仅体现的是对数据库操作的处理速度还有连接池自身的稳定性。通过压力测试,对比能够看出DBCP连接池要比Hibernate3.0

默认自带的数据库连接池c3po快,但是稳定性却不如它,并发用户过多常常会自动断开连接。通过对本连接池的测试发现,有连接池的时候对数据库的操作要比没有连接池的时候快3-5秒。一般数据库连接池采用DBCP作为连接池时,默认的初始化为50个,速度不会有太大问题。正常情况下,系统没问题,压力测试从10个并发开始,每一次增量是增加10个并发,至200-400并发用户将成为一个重要节点,性能的优越能得以体现。而本连接池没有经过压力测试,多用户的并发访问时其稳定性还有待验证。

5系统测试问题总结

5.1连接池的泄露问题

5.1.1产生现象当系统访问量较大时,会出现连接池连接数居高不下的情况,如果在关闭数据库连接的过程中发生错误会导致他们不再会被重用。这就叫做“数据库连接池泄漏”。这将会最终导致web应用程序数据库连接失败。甚至造成连接池崩溃,从而无法进行数据交互,服务器当机。

5.1.2解决办法

常见的程序错误写法有以下两种

1.当连接执行数据库操作出错时,未执行数据库关闭。

Connection

conn=Dbutil.Getconnection();

//执行数据库操作

Dbutil.

Closeconnection();

在以上代码中,如果执行数据库操作过程中,出现异常,系统从出现异常处停止,不再执行下面的代码,造成数据库连接池无法回收,连接泄露的情况。正确的代码写法应如下:

Try{Connection

conn=Dbutil.Getconnection();

;//执行数据库操作

}

catch(Excepti

on

e)

{}

finally{

Dbutil.

Closeconnection();

//异常处理后必须处理的方法。}

这样将保证了在执行数据库操作过程中即使出现异常,也将能够执行

数据库连接池的回收。

2、在连接中嵌套数据库连接,如下TryConnection

conn=Dbutil.

Getconnection()

;

doMethodA(

)//执行数据库操作

}

catch(Exce

ption

e)

{

}finally{

Dbutil.

Closeconnection()

;}Public

void

doMethodAo{

//再次打开数据库进行操作

}

在上面的例子中,当调用方法doMethodA()时,在方法内部又打开了一个数据库连接,这时造成同一线程中打开了两个连接,如果不注意,很有可能就打开了更多的连接,以至于成为系统性能的瓶颈。

5.2多数据库服务器问题

如今在一个应用系统中,一般可能不只访问一个数据库,有时会访问两个或是多个数据库,各个数据库的数据必须融会到同一个业务逻辑中,否则就成为一个个低价值的数据孤岛,这时就需用到多数据源。在一个应用系统中,一般会有一数据源应用较多,其它数据源应用较少,我们把应用较多的数据源定义为主数据源,其它数据源定义为从数据源。我们为每一个数据源定义一个名称,在应用系统中根据该名称定向到数据源。在应用中,我们定义一个静态Hashtable对数据源进行保存。结论

通过本次课题的研究,可以看出在广泛采用B/S结构的Web应用程序中,并发访问数据库是一关键性问题。只有充分运用连接池访问技术,才能提高数据库的访问效率,改善Web

应用,从而减少系统开销。在进

行与数据库有关的应用开发中,数据库连接的管理是一个重点,也是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。对于众多用户访问的Web应用,采用数据库连接技术的系统在效率和稳定性上比采

用传统的其他方式的系统要好很多。

本文采用了一些广

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论