数据库连接池

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据库连接池技术研究和实现

唐满英

(永州市职业技术学院,湖南永州 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 管理类与主程序的接口

相关文档
最新文档