收稿日期5作者简介王丽辉(),女,吉林省九台市人,实验师,从事计算机教学与实验工作。
在Web 系统中用连接池访问数据库王丽辉,王东来(吉林农业科技学院信息工程学院,吉林132101)摘 要:介绍了基于Java 的数据库访问机制,阐述了连接池的概念以及连接池的具体实现。
对实际应用中出现的问题进行分析,提出了使用连接池技术的解决方案。
分析了连接池的工作原理,并通过一个实例给出了连接池技术的实现方案。
关键词:Jav a ;连接池;JD BC中图分类号:TP393 文献标识码:AUsing Connection Pool to Visit Databa se in Web SystemWAN G Lihui ,WANG Donglai(Jilin Agricu ltural Science and Techno lo gy Colleg e C ollege o f In formation Eng in eering ,Jilin 132101,Ch ina)A bstract :In this paper ,introduced t he access mechani sm based Java and explained the c once ption and im ple 2mentation of c onnection pool.Put forw ard the s olutionson how to use connection pool technology a fter the problems in applications were analysed.Analysed the w orking principle and gave an implementations pr ogram by one exam ple.K ey w or ds :Java ;connection pool ;JDBC Java 是S UN 公司推出的一种面向对象的语言,它利用特有的虚拟机技术实现了平台的无关性,而这一特性又促使其成为一种开发W eb 应用系统的优秀语言。
由于在网上处理的数据成倍增加,而且越来越复杂,迫使科学研究者和应用开发者必须考虑如何快速建立完善有效的新模型以及如何改进和优化一些传统模型。
众所周知,在一个基于数据库的Web 系统中,建立数据库连接的操作是系统中代价最大的操作之一。
很多时候,可能网站速度瓶颈就在于此。
为此我们提出了在传统模型中引入连接池技术的方法,从而很好地解决了这个问题。
连接池技术是通过重用一组连接对象,使所有用户之间共享一组已经打开的连接。
我们提出的方法可以节省建立数据库连接的时间,提高访问数据库的速度。
1 Java 应用程序访问数据库基本原理Java 语言的跨平台性、安全性以及可移植性等特性使其成为开发数据库的一种优秀语言[1]。
JD BC (Java DataBase C onnectivity )是Java 程序连接和存取数据库的应用程序接口(API ),此接口是Java 核心API 的一部分。
JD BC 向应用程序开发者提供了独立于数据库的统一的API 。
JD BC 是由一组驱动程序实现的Java 接口,驱动程序负责从标准JD BC 调用向支持的数据库所需要的具体调用转变。
除了向开发都提供统一的独立于D BMS 之外的框架,JD BC 还提供了让开发者保持数据库厂家提供的特定功能的办法。
驱动程序管理器API (对程序员是透明的)与实际连接到数据库的各个第三方驱动程序进行通信,并且返回查询的信息,或者执行由查询规定的操作。
(1)建立数据库连接;(2)利用SQ L 语句对数据进行操作;(3)断开数据库连接在基于数据库的W eb 系统中,在某一较短的时间段内,只有少数Web 请求时,传统模式还能很好的工作,但随着请求数不断增加,系统的开销越来越大,响应W eb 、请求的速度越来越慢,直到无法响应W eb 请求。
造成这种结果的原因是由于传统模式存在下面的一些缺陷:(1)一次W eb 请求都需要建立一次数据库连接。
每建立一次数据5:2009-0-10:1972-11库连接就需要花费0.05~1s 的时间,还要花费很大的系统开销;(2)不能控制被创建的连接对象数,系统资源被毫无顾忌的开销,最后导致系统内存溢出,服务器崩溃;(3)必须管理每一个连接,确保它们能被正确关闭。
如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终将不得不重启数据库。
2 在传统模式中引入连接池2.1 连接池的基本概念连接池(C onnection Pool )顾名思义,就是众多连接对象的“缓冲存储池”,也即是连接对象的集合体。
连接池内部提供一种管理机制,能控制连接池内部连接对象的个数,对应用程序提供获取和释放连接的接口。
完善的连接池,还能够控制连接对象的生存周期[2]。
2.2 工作机制2.2.1 连接池的工作 主要由3部分组成:(1)连接池的建立;(2)连接池中连接的使用管理;(3)连接池的关闭。
连接池的工作原理。
见图2。
2.2.2 建立连接池 建立连接池时,连接池应从数据库中一次性获取预设数目的连接对象。
这些连接对象作为系统可分配的自由连接,可在以后使用时直接从连接池获取,这样可避免随意建立、释放连接所带来的开销。
2.2.3 管理连接池 管理连接池是连接池机制的核心。
当用户需访问数据库时,不是直接同数据库建立连接,而是向连接池申请一个连接,如果连接池中有空闲连接,则把空闲连接分配给用户;否则,要检查连接个数是否达到了连接上限。
如果没有达到上限,可以建立一个新连接分配给用户;如果已经达到了上限,则需要等待,直到有别的用户释放连接时再把释放后的连接分配给该用户。
由此可见连接池能保证数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
2.2.4 关闭连接池 当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库,即关闭所有数据库连接。
当传统模式中引入连接池后,访问数据库的模式会有改变。
3 连接池的实现3.1 连接池的模型通过C onnection P ool 类来实现连接池模型,表1是C onnec2tion Pool 实现的连接池模型。
表1 C onnection P ool 实现的连接池模型C onnectionP oolclients :intns tance :C onn ection Po ol freeConn ections :V ector driver :D riv erm ax:in t连接池的唯一实例表示已创建的连接对象个数用来“存储”连接对象表示JD BC 的驱动程序表示允许创建的连接对象的最大个数g etIns tance :C onnecti on P ool in it ()g etC onnecti on :C onnecti on freeConn ection :v oid 取出唯一连接池实例连接池初始化从连接池中取出一个连接对象把连接对象放到连接池释放连接池和其中的所有连接对象6release :v oid113.2 X M L配置表为了实现连接池,必须做一些准备工作,首先需要建立一张X ML表来配置一些所需的参数和相关属性:(1)c onnections创建C onnection对象所需的参数名,值为url:user:passw ord。
其中,url:提供一种标志数据库的方法;user:数据库用户名; pass2w ord:数据库用户密码。
(2)dr ivers创建C on2 nection对象所需的JD BC驱动程序的参数名。
(3) max允许创建的最大连接对象数。
下面是X M L配置表(config.xml):<?xml version=“1.0”standalone=“yes”?><c onfig connections=“标志数据库:数据库用户名:数据库用户密码”drivers=“标志JD BC驱动程序”max=“允许创建的最大连接对象数”></c on fig>3.3 解析X M L配置表为了连接池实例和连接对象能得到所需要的参数,必须先构造一个解析方法来解析X M L配置表。
这个方法为S tring get2C onfig(S tring)。
对于这个方法,只要传入X ML配置表中的con2fig元素的一个属性名作为参数,就可以得到对应的属性值。
本文是用JAX P包中的D OM来解析X M L配置文件的。
下面是实现getC onfig的过程。
(1) 建立一个解析器,D ocumentBuilderFactory dbf=D ocumentBuilderFactory.newI nstance();(2)当获得一个工厂对象后,使用它的静态方法new D ocu2mentBuilder()方法可以获得一个D oc2 umentBuilder对象。
这个对象代表了具体的D OM 解析器。
但具体是哪一种解析器,微软的或者I BM的,对于程序而言并不重要。
D ocumentBuilder db=dbf.new D ocumentBuil der ();(3)然后,就可利用这个解析器来对X M L文档进行解析D ocument doc=db.parse(“c onfig.xml”);D ocumentBuilder的parse()方法接收一个X M L文档名作为输入参数,返回一个D ocument对象。
(4)接着,获得config这个元素对象N ode List links=doc.get ElementsByTagName (“f”);=()();使用D ocument对象的get ElementsByTagName()方法,可以得到一个N odeList对象,再使用N ode List 对象的item()方法得到列表中的每一个N ode对象,在这里得到第一个对象(因为只有一个对象),然后把N ode对象造型为Element对象。
(5)传入属性名得到相应的属性值属性值=li nk.getA ttribute(属性名)调用E lem ent对象的方法getAttribute得到属性值。
3.4 连接池中的主要方法实现已经构造了配置表,解析了配置表,那么准备工作已经完成。
下面是连接池的一些主要方法的实现:(1)获得唯一连接池实例get I nstanceif(I nstance!=null)then{return Instance;}else{I nstance=ne w C onnectionP ool();}(2)连接池初始化init()S tring drv=getC on fig(“drivers”);driver=(Driver)C lass.forName(drv).newInstance ();max=Integer.val ueO f(xp.getC onfig(“max”)). intValue();(3)获得连接对象getC onnectinif(freeC onnections.size()>0){c on=(C onnection)freeC onnections.firstElement ();freeC onnections.rem oveElementAt(0);}else{if(clients<m ax){r eturn newC onnection;}else{return null;}}(4)把连接对象放回到连接池freeC onnectionfreeC onnections.addElement(连接对象);(5)释放连接池和所有的连接对象releaseEnumeration allC onnections=freeC onnections. elem ents();while(allC onnections.hasM oreElements()){C onnection con=(C onnection)allC onnections. nextElement();con.close();}//关闭所有未关闭的连接池freeC onnections.rem oveAllElement s();D M D(); 实现连接池所使用的关键技术con igElement link E lem ent links.item0river anager.deregister river driver 4711本文的连接池主要是用Java语言实现的,它还用到了一些其他关键技术:X M L技术、D OM技术、JD BC技术等[4]。