基于JDBC的数据库连接池高效管理策略 - 编程入门网
有空闲连接,就在已经分配出去的连接中,寻找一个合适的连接给客户(选择策略会在关键议题中详述),此时该连接在多个客户间复用。
当客户释放数据库连接时,可以根据该连接是否被复用,进行不同的处理。如果连接没有使用者,就放入到连接池中,而不是被关闭。 可以看出正是这套策略保证了数据库连接的有效复用。 3.3、配置策略 数据库连接池中到底要放置多少个连接,连接耗尽后该如何处理呢?这时一个配置策略。一般的配置策略是,开始时,根据具体的应用需求,给出一个初始的连接池中连接的数目以及一个连接池可以扩张到的最大连接数目。本方案就是按照这种策略实现的。 基于JDBC的数据库连接池高效管理策略(2)时间:2010-12-17关键议题 本节将对上述解决方案中的关键细节进行详述,正是这些关键的策略保证了数据库连接复用的高效和安全。 4.1、引用记数 3.2节中的分配、释放策略对于有效复用连接非常重要,我们采用的方法也是采用了一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面用的非常广泛,我们把该方法运用到对于连接的分配释放上。每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现上,我们采用了两极连接池,空闲池和使用池。空闲池中存放目前还没有分配出去被使用的连接,一旦一个连接被分配出去,那么就会放入到使用池中,并且增加引用记数。 这样做有一个很大的好处,使得我们可以高效的使用连接,因为一旦空闲池中的连接被全部分配出去,我们就可以根据相应的策略从使用池中挑选出一个已经正在使用的连接用来复用,而不是随意拿出一个连接去复用。策略可以根据需要去选择,我们采用的策略比较简单:复用引用记数最小的连接。Java的面向对象特性,使得我们可以灵活的选择不同的策略(提供一个不同策略共用的抽象接口,各个具体的策略都实现这个接口,这样对于策略的处理逻辑就和策略的实现逻辑分离)。 4.2、事务处理 前面谈到的都是关于使用数据库连接进行普通的数据库访问。对于事务处理,情况就变得比较复杂。因为事务本身要求原子性的保证,此时就要求对于数据库的操作符合"All-All-Nothing"原则,即要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。 Connection本身具有提供了对于事务的支持,可以通过设置Connection的AutoCommit属性为false,显式的调用commit或者rollback方法来实现。但是要安全、高效的进行Connection进行复用,就必须提供相应的事务支持机制。我们采用的方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性(如果事务不独占一条连接,那么要保证事务的原子性并且又不妨碍复用该连接的其他和该事务无关的操作,基本上不可能,除非Connection类是你开发的),并且又不会妨碍连接的复用,因为隶属于该事务的所有数据库操作都是通过这一个连接完成的,并且事务方法又复用了其他一些数据库方法。 在我们的连接管理服务提供了显式的事务开始、结束(commit或者rollback)声明,以及一个事务注册表,用于登记事务发起者和事务使用的连接的对应关系,通过该表,使用事务的部分和我们的连接管理部分就隔离开,因为该表是在运行时根据实际的调用情况,动态生成的。事务使用的连接在该事务运行中不能被复用。 当使用者需要使用事务方法时,首先调用连接管理服务提供的beginTrans方法,该方法主要处理流程如下(伪码描述):
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |