1.侯铭2.张毅(1.重庆大学软件学院;2.重庆电子工程职业学院)
【摘要】在多层体系结构应用软件中,采用数据库连接池是提高数据库访问效率的主要途径之一。本文在分析了传统数据库连接池管理策略方面的不足后,提出了对传统数据库连接池的改进方案。经实验测试分析表明,改进后的数据库连接池可以大大减少系统的响应时间,降低系统资源的开销,从而提高系统的整体性能。
【关键词】数据库连接池;复用;事务处理;自适应
1.连接池的调度管理策略
1.1现有连接池调度策略的不足
现有连接池技术的参数配置及管理存在以下问题:①连接池的参数配置策略大多是静态的,依据Config.xml参数配置表设置池参数,这些参数不能根据应用需求的变化而适时地调整数据库连接池的容量。②在系统运行时,客户请求数量的多少往往表现出类似于波峰和波谷的曲线,所以我们希望在系统允许的范围内,提供对连接池的自适应动态管理。而现有连接池运行中的资源调度管理策略还不能适应应用的动态需求。③缺少对连接池的管理机制。现有连接池可以完成用户验证、安全上下文配置等任务,但是如何保证连接池资源不释放给末授权用户使用?如何让关键性事务获得优先服务?如何让客户应用主动获得对连接池的控制?现有数据库连接池无法解决。
1.2对现有连接池的改进方案
1.2.1连接复用方案
我们通过ReferenceCounting(引用记数)[2]实现数据库连接的复用。我们把该方法运用到连接的分配和释放上。对每一个数据库连接,保留一个引用记数,用来记录该连接使用者的个数。我们把连接池分为空闲池和工作池。空闲池中存放目前还没有分配出去的连接,一旦一个连接被分配出去,那么就会把该连接放入到工作池中,并且增加引用记数。这样做有一个很大的好处,使得我们可以高效的使用连接,因为一旦空闲池中的连接被全部分配出去,我们就可以根据相应的策略从工作池中挑选出一个正在使用的连接用来复用,而不是随意拿出一个连接去复用。策略可以根据需要去选择,我们采用的策略比较简单:复用引用记数最小的连接。
1.2.2事务处理方案
前面谈到的是普通的数据库访问,对于事务处理,情况就复杂得多。因为事务要求原子性的保证,此时就要求对于数据库的操作符合“ALL—ALL_Nothing”原则[6],即要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用可以通过设置Conmction的AutoCommit属性为false,显式的调用commit或者roll—back方法来实现事务处理。但是要安全、高效的进行连接复用,就必须提供相应的事务支持机制,我们采用的方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性,并且又不会妨碍连接的复用,因为隶属于该事务的所有数据库操作,都是通过这一个连接完成的,并且事务方法又复用了其他一些数据库方法。由连接管理服务提供了显式的事务开始、结束声明,以及一个事务注册表,用于登记操作事务的客户和使用连接的事务之间的对应关系,通过该表,将使用事务的客户和使用连接的事务隔离开。事务使用的连接在该事务运行中不能被复用。在我们的实现中,客户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表,使用已经分配的连接来完成的。当事务结束时,从注册表中删除相应表项。
1.2.31自适应管理方案
采用基于XML配置表,使系统可以根据用户的不同应用需求来配置连接池参数;设置运行日志,在运行过程中能够根据日志来自适应地调整连接池配置参数;连接池调度算法采用类似工作集的策略,根据过去对资源的使用情况决定连接池的大小以及连接池中各连接的优先级;对用户实行优先级管理,高优先级的用户可以剥夺那些低优先级且可被剥夺的资源,尽可能保证高优先级的用户享受优先服务;对安全性要求较高的连接进行验证使用,由用户在配置中指定。通过这一系列的调整策略的实施,可以建立一个高效率、实用的自适应数据库连接池。
2.测试
为了与传统连接池比较,我们将改进后的连接池部署到WebLogic服务器上,同时在服务器上还安装了基于Web的应用程序供测试使用。我们使用JAVA设计了一个测试Web访问速度的工具,其作用是创建多线程访问指定的URL,并返回在指定访问量的情况下系统的响应时间。需指出的是,实际测试的结果与服务器的硬件和软件配置有很大关系。本文测试结果为:①当服务器内存空余较多时,传统连接池达到最大连接数就不再响应请求,而该文的连接池在没超过内存底限时可继续工作;②对于频繁使用已在连接池中的连接,传统连接池访问1000次需要13454ms。改进后的连接池需要9208ms;③对于不经常使用已在连接池中的连接,传统连接池访问1000次需要13459ms,改进后的连接池需要9832ms;从以上三条测试结果表明改进后的连接池性能明显比传统连接池优越;
3.结语
本文在传统数据库连接池的基础上给出了改进数据库连接池的方案,使得高效、安全的数据库连接成为可能。采用此方案可以大大提高应用系统的数据访问效率,并为开发大型数据库应用系统,提供了完整的策略。
参考文献:
[1]赵勇超,郑宁,葛瀛龙.Java中连接池的设计与实现[J].计算机应用研究,2004,21(6):219-221,224.
[2]周彩兰.Java的Web数据库连接池高效管理策略[J].武汉理工大学学报,2004,26(5):