当前位置:文档之家› 数据库连接池

数据库连接池

数据库连接池技术研究和实现唐满英(永州市职业技术学院,湖南永州 425100)摘要数据库和数据库连接池技术已经得到了广泛的应用,数据库连接池建立的例子也很多。

本文先简要介绍了数据库连接池的概念,然后分析了连接池的管理,即:连接池建立、连接池管理和连接池关闭。

随后介绍了如何在基于Java的基础上建立连接池:定义连接池类、创建管理类、管理类与主程序的接口。

最后简要分析了数据库连接池的优化架构,优化的主要目标是能动态调整连接池的容量,避免资源浪费。

关键词数据库;连接池;技术实现1 数据库连接池简介数据库连接池是一个存储数据库连接的缓冲池。

在实际应用中,同一个数据库可能有多个用户反复连接和断开数据库,这会消耗数据库的很多资源,造成浪费。

在具体操作上,连接池会选择性地保留程序释放的数据库连接,以便用户以后使用。

当用户在连接上调用Open时,池进程就会检查池中是否有可用的连接,如果某个池连接可用,会将该连接返回给调用者,而不是打开新连接,以此节约连接资源,提高数据库的使用效率。

同理,应用程序在该连接上调用Close时,池进程会将连接返回到活动连接池中,而不是真正关闭连接。

连接返回到池中之后,即可供其它用户在下一个Open调用中使用。

图1表示了连接池遇到新连接时的工作过程[1]:图1 数据库连接池的工作机制图1解释了数据库连接池的机制,即当用户申数据库连接时,在数据库池内连接匹配的情况下,便会从数据库连接池中直接获得一个一直被保持的连接。

2 连接池管理连接池管理主要由三部分组成:连接池的建立、连接的使用管理、连接池的关闭。

通过这三部分,连接池成为众多连接对象的“缓冲存储池”,也就是连接对象的集合体,它提供一种管理机制来控制连接池内部连接对象的数目,对应用程序提供获取、释放连接的接口。

2.1 连接池的建立应用程序中要建立一个在系统初始化时就已分配好连接数目的静态连接池,且这些连接不能随意关闭。

这些连接对象作为系统可分配的自由连接,以后所使用的连接都从连接池获取,这样可避免随意建立、释放连接所带来的开销。

2.2 连接的使用管理连接的使用管理是连接池管理机制的核心。

有了连接池,所有用户申请连接时直接向连接池申请,而非数据库。

同理,所有用户释放连接时,是向连接池释放连接而非关闭数据库连接。

连接池分配释放策略是[2]:连接池先检查有否未被分配的空闲连接,若有则把空闲连接分配给用户;反之要检查连接个数是否达到了连接上限。

如果没有达到上限可以建立一个新连接分配给用户,否则需要等待,直到有别的用户释放连接时再把释放后的连接分配给该用户。

由此可知:连接池技术能够保证数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。

2.3 连接池的关闭用户退出程序时,与连接池的建立是一个相反的过程,即把在连接池建立时向数据库申请的连接对象统一归还给数据库连接池,以便连接池分配给其它用户。

3 基于java的连接池类的设计主要要分为三个步骤:定义连接池类;创建管理类;管理类与主程序的接口。

3.1 定义连接池类数据库连接池设计的方法很多,但是连接池的构建首先都要确定类,本方法构建如下五个类[3]:①GetProperty类,该类的功能用于从文件poolfile中读取数据库连接池的一般属性,如连接用户名,密码等验证信息。

采用该方法的好处就是连接池不用关心操作的是什么类型的数据库,以及数据库的属性。

当数据库的类型或属性发生改变时,管理员只要修改文件PropFile即可。

②ConnectionFactory类,该类为连接池的工厂类,其中定义一些参数如:正在使用的连接池参数use、空闲连接池参数idle、最大连接数maxactive、最小连接数minactive、当前连接数active和管理策略参数等。

③FactoryMangeThreadl类,该类的功能是实现静态管理和动态管理两种策略,并设置了最大限制和恒定的连接数,它将连接池又细分为两级小连接池,一个空闲连接池,一个使用池。

④FactoryParam类,该类是连接池工厂的参数类,定义了最大连接数和最小连接数,并定义了回收策略,提供良好的用户接口等。

⑤Substituteconnection类,该类定义了数据库连接和监控连接创建的语句,数据库上一次访问的时间和数据库的状态是否为忙,要接管的函数的名字等参数。

它通过触发java.1ang.reflect包中invocationHandler的invoke方法,运用动态代理机制接管接口的方法接管,并实现了连接池的名字与其对象之间的映射。

在建立连接池之前需要确定数据库的一些基本属性,如URL,username,password等。

在本例中,先创建一个文件(文件名poolfile)用于存放这些属性。

该文件中的属性由前面设置的类 GetProperty 中的函数读取,核心代码如下:public GetProperty(String infile){lnputStream=lnStream.getClass().getResourceAsStream(infile);Properties Props=new Properties0;try{Props.1oad(inStream);driver=Props.getPropetry("driver");URL=Props.getPropetry(URL);usemame=Porps.getPropetry("usemame");//取用户名password=Porps.getPropetry("password");//核对密码catch(Exception)return;}以上为连接池在进行连接时对用户基本信息的核对,如通过则连接池按照其管理规则分配连接,即先判断是否有空闲连接,如有则分配给用户,如没有则判断当前连接数是否已达到最大连接数,如没有则建立新的连接,否则用户需要等待其它用户释放连接。

根据以上的逻辑规则,运用相关接口定义,建立连接池核心代码如下:public class ConnectionFactory{pirvate Connection CreateConnection();//创建新的连接,检查有无空闲连接,连接数是否达到了上限,若否定则创建新连接。

public syncbronized Connection getConnection();//把释放的连接放入连接池中。

public syncbornized void release();} //关闭所有连接}3.2 创建管理类以上的类的最大作用体现在对连接数的判断上。

连接池的机理就是在其中存贮足够多的连接数,并在适当情况下可以创建新的连接,保证用户能够自由连上。

但是涉及到具体连接的恶分配以及释放时,还必须通过另外的类来实现,本例中设为连接池管理类,定义如下:public class ConnectionPoolManager{static synchronized public ConnectionPool Manager getlnstance();private void init();//管理类的初始化public Connection getConnection(string poolname);//poolname为指定的连接池名,意为从指定的连接池中取得一个数据库连接public void backconn(String poolname,Connection conn)//poolname为指定的连接池名,意为将释放的连接归还给指定的连接池public synchronized void close(); //关闭一个连接池public synchronized void release();//释放所有的连接public synchronized void destroy();//销毁一个连接池}.连接管理类ConnectionPoolManager用于管理多个连接池对象,它提供以下功能:装载和注册ODBC驱动程序;根据在属性文件中定义的属性创建连接池对象;实现连接池名字与其实例之间的映射;跟踪客户程序对连接池的引用,保证在最后一个客户程序结束时安全地关闭所有连接池。

3.3 管理类与主程序的接口在类ConnectionPoolManager中,涉及到管理类的初始化,因此必须创建并设计初始化过程(init(()),同时需要创建的还有响应客户程序的服务请求(service()),以及终止运行,释放所有资源(destroy())。

上述关键步骤中的相关操作为:在init()中,用实例变量connManager保存调用ConnectionPoolManager.getlnstance()所返回的引用;在service()中,调用getConnection(string poolname),执行数据库操作,用freeConnection()将连接返回给连接池;在destroy()中,调用release()释放所有连接和资源。

4 数据库连接池优化前面已经设计了一种数据库连接池,但有个不足的地方就是不能随意调整连接池的容量。

如果连接池容量已经达到最大,且都被分配出去之后,再有新的用户是不能连接到数据库的,此时连接池已经不能新增连接,只能等待其它用户释放连接。

因此连接池容量应该可以动态调整,达到在访问量很大的时候应该增加连接池中连接的数量,以应对众多的连接请求,而在访问量较小的时候,应当减少池中连接的数量,以节约系统资源。

下面将对它进行优化,使其具有容量可调的功能。

连接池优化主要分为三部分:与用户交互的图形界面,以及处理用户操作的程序;将用户请求传递到后台连接池的程序;处理与连接池相关的功能的程序。

对于处理与连接池相关功能的程序,本文将直接调用DBCP中BasciDatasource类中的相应方法进行实现(DBCP是一个典型的数据库连接池,它已经被嵌入到Apache Tomcat Web服务器中),其总体构架如图2所示。

图2 连接池优化的程序总体架构书室上面的架构中,View是视图,controller是控制器,而Model是模型。

Model将创建连接池,它通过调用Basie Datasouree中的SetMaxAetive调整池的容量,通过调用该类中的close方法关闭连接池。

view将用户的请求(如要求调整连接池的容量)传递给Controller,而在controller处理用户请求时是调用Model中的相应的方法(如adjust()来完成这一次的请求。

这种构造的模式称之为Model-View-controller,即MVC模式[4]。

相关主题