一种支持分布式事务的数据库的连接方法
技术领域
本发明属于分布式数据存储领域,尤其是涉及一种支持分布式事务的数据库的连接方法。
背景技术
随着信息化技术的快速发展,一个企业的应用系统也越来越多,应用所涉及的业务也越来越复杂,一个业务经常需要访问企业内多个不同的数据库来完成,也有可能访问外部的数据库,并且要保障事务的ACID属性以及高并发性。
为了适应应用业务的发展需要,目前主流关系数据库系统都支持分布式事务操作,并遵循国际XA/OPEN标准。为了保障访问数据库的并发性能,减少建立到数据库连接的时间,各厂商提供的中间件产品都提供了支持分布式事务的分布式数据库连接池。
所述分布式数据库连接池,在系统初始化时,读取配置文件确定所连接的数据库,并建立到指定数据库的连接,缓存供使用。对于多个数据库,需要建立多个相应的连接池,并进行配置。当应用系统需要访问多个数据库时,需要一一向各个连接池发出请求,获取支持分布式事务的数据库连接,然后应用系统生成全局分布式事务ID,并一一启动分布式事务,进行SQL执行操作,发送SQL结束操作,最后进行提交。对于每个事务都要进行上述过程。对于应用的每次请求,连接池都随机分配空闲的连接供应用使用,避免了频繁地向数据库建立实际的连接,有效地提高了数据库连接的利用率,减少了建立连接所需的时间,极大地提高了系统的并发性能。但也存在着两个问题需要解决,问题一:应用系统开发极为不便,面对多个数据库,需要自己完成分布式事务所需的各项细致操作;问题二:同一线程的不同事务操作或者同一事务的不同操作无法使用相同的数据库连接,造成性能降低和数据操作错误。
如图1,假设应用系统有五个事务,需要访问三个不同的数据库A、B、C,则需要配置三个连接池,分别缓存到三个数据库的连接。从图中可以看出应用需要向三个连接池共发出11次获取分布式连接对象的请求。配置不方便,逻辑也较复杂。同时为了执行真正的事务,应用系统还必须执行图2所示的以下过程:
步骤201,从连接池中获取所需的分布式连接;需要从连接池一中获取分布式连接对象A1,从连接池2中获取分布式连接对象B1;
步骤202,生成全局分布式事务标识XID;应用系统自已生成分布式事务的全局标识XID,要求全局唯一;
步骤203,通知所有分布式连接执行分布式事务启动操作;应用系统需要逐个调用所获得的分布式连接对象的Xa_start方法,通知数据库启动分布式事务;
步骤204,在分布式连接对象上执行SQL操作;应用系统据事务需要,在分布式连接对象上执行SQL操作;这些分布式SQL操作组成整个分布式事务;
步骤205,在各个分布式连接上执行结束操作;应用系统逐个调用分布式对象,执行Xa_end操作,通知各数据库准备提交;
步骤206,提交整个分布式事务;应用系统提交整个分布式事务,最终完成跨数据库的整个事务操作。
由以上操作可以看出,所述分布式数据库连接池,只是缓存了一个分布式事务所需的到多个数据库连接中的一个连接,而非实际意义上的对分布式事务所需的所有连接的缓存,也就必然要执行步骤202、203、205这样的细节操作,给应用开发带来很多不便,使得应用逻辑更加复杂。
在另一个场景中,如图1和图3所示,参考图1,假设只考虑应用事务一和应用事务四。事务一和事务四属于同一个线程,事务都只涉及数据库A和数据库B。此时,由于到数据库A和数据库B的连接池各自维护到各自数据库的连接,并随机分配连接给请求者,所以事务一执行完后,事务四所获得的实际连接则有可能与事务一曾使用的连接不同。这样如果事务四与事务一有关联的话,则可能造成数据操作错误。应用系统执行事务一和事务四的过程参见图2所示,详细说明如下:
步骤301,从连接池中获取所需的分布式连接;应用系统从连接池一中获得分布式连接对象A1,从连接池2中获取分布式连接对象B1;
步骤302,使用分布式连接执行事务一;应用系统按图1步骤202到步骤206完成事务一的执行;
步骤303,从连接池中获取所需的分布式连接;应用系统从连接池一中获得分布式连接对象A2,从连接池2中获取分布式连接对象B1;注意此处,由于连接池随机分配分布式连接,所以从连接池一中获得是分布式连接对象A2,与事务一请求获得的不同;连接池二中获得连接对象与事务一时相同,也不代表一定相同,此处只是示意,有可能相同,也有可能不同。如果缓存的连接很多,则不相同的概率将大大增加。
步骤304,使用分布式连接执行事务四;应用系统按图1步骤202到步骤206完成事务四的执行;
综上所述,现有分布式数据库连接池无法有效地降低应用系统使用分布式事务的复杂性,也无法解决同一线程多次使用分布式数据库连接时可能出现的数据操作错误和失败的问题。
发明内容
本发明要解决的问题是提供一种支持分布式事务的数据库的连接方法,尤其适合于面对多个不同的数据库。
为解决上述技术问题,本发明采用的设计思想是:对全局分布式事务所涉及的多个数据库连接上的各个分布式事务操作进行封装,抽象出新的对象,多节点执行器,并进行缓存,方便应用系统使用,同时为应用系统的同一请求线程分配相同的多节点执行器对象。
本发明采用的技术方案是:一种支持分布式事务的数据库的连接方法,包括:
1)将分布式事务所涉及的分布式数据库连接对象作为一个整体进行封装,形成多节点执行器,并将多节点执行器对象作为分布式数据库连接池的缓存对象进行缓存,并建立与应用系统的对应关联关系;
2)分布式数据库连接池接收到应用系统请求后,确定与该请求对应的有逻辑关系的缓存的封装的对象;
3)将上一步骤所确定的多节点执行器对象分配给应用系统用于对数据库的分布式事务操作。
进一步的,所述的第一步骤包括:
将对所有分布式数据库连接上的分布式全局XID生成、分布式事务启动、分布式事务结束以及其它分布式事务提交进行封装,为应用提供方便的接口。
进一步的,所述的第二步骤中的逻辑关系是指向连接池请求的线程的标识,包括由线程标识衍生出的标识;封装对象属性指其与应用系统属性相对应的标识与封装对象属性之间的关系。
进一步的,所述的第一步骤中建立与应用系统的对应关联关系为构造HASH算法。
进一步的,所述的第二步骤还包括:在应用系统第一次请求时,连接池生成多节点执行器对象并进行缓存,同时建立与应用系统属性对应的关联关系;再次请求时,根据请求中的应用系统属性,通过所构造的HASH算法获得缓存的多节点执行器对象。
进一步的,所述的连接方法还包括:
建立并维护应用系统所使用的多节点执行器对象的闲表和忙表;所述的闲表记录了连接池中缓存的未被应用程序使用的多节点执行器,闲表中的多节点执行器可以分配给应用程序使用;所述的忙表记录了连接池中缓存的正在被应用程序使用的多节点执行器,忙表中的多节点执行器只有使用该执行器的应用程序将其归还给连接池后,才能分配使用
更进一步的,所述的连接方法还包括:
1)根据请求中的应用系统的标识,查询闲表,如果有空闲多节点执行器可用,将所确定的多节点执行器对象分配给应用系统用于对数据库的分布式事务操作;否则执行下一步骤;
2)根据请求中的应用系统的标识,查询忙表,如果有对应多节点执行器,将所确定的多节点执行器对象分配给应用系统用于对数据库的分布式事务操作;否则,建立新的多节点执行器对象,将分布式事务所涉及的分布式数据库连接对象作为一个整体封装和缓存。
本发明具有的优点和积极效果是:能够使应用系统从繁杂的分布式事务处理逻辑中解脱出来,专心于业务逻辑;同时,也能够保障对多个数据库的分布式访问读写操作的正确性,有效提高对多数据库进行分布式事务操作的利用率。
附图说明
图1为现有技术分布式数据库连接资源分配情况示意图;
图2为现有技术应用系统单事务使用分布式数据库连接池流程示意图;
图3为现有技术应用系统同线程两事务使用分布式数据库连接池流程示意图;
图4为本发明一实施例分布式数据库连接资源分配情况示意图;
图5为本发明一实施例中应用系统单事务使用分布式数据库连接池流程示意图;
图6为本发明一实施例中应用系统同线程两事务使用分布式数据库连接池流程示意图;
图7为本发明分布式数据库连接资源确定流程示意图。
具体实施方式
对于多节点执行器的封装,一个多节点执行器对象将包含多个分布式数据库连接,并将所包含的分布式数据库连接的职能进行封装,对应用系统提供方便易用的接口。如:封装后只提供简单的启动事务操作、执行SQL操作、提交操作、回滚操作等。多节点执行器对象将进行缓存,以提高性能,以及为同一线程提供复用,以方便应用系统可以决定在多次调用后统一提交。
下面结合附图和本发明的一个实例对本发明做详细的说明,仍以图4中应用事务一为例说明应用系统如何使用本发明的支持分布式事务的数据库连接资源管理方法来应用系统单一事务,如图5所示:
步骤501,从连接池中获取所需的多节点执行器;向连接池请求对数据库A、数据库B的多节点执行器;连接池建立到数据库A和数据库B的分布式连接对象A1和B1,并建立多节点执行器对象多节点执行器一;返回给应用系统;
步骤502,使用多节点执行器启动分布式事务;应用系统调用多节点执行器启动分布式事务;
步骤503,使用多节点执行器在分布式节点上执行SQL;应用系统调用多节点执行器执行SQL操作;
步骤504,使用多节点执行器提交分布式事务;应用系统调用多节点执行器提交事务,完成操作。
对于确定应用系统属性与多节点执行器之间的关联关系时,可以使用应用系统请求线程的ID来建立与缓存的多节点执行器对象的关联关系。
以图4中应用事务一、应用事务四为例,来说明应用系统同一线程如何获得同一多节点执行器对象的操作过程,如图6所示:
步骤601,从连接池中获取所需的多节点执行器;向连接池请求对数据库A、数据库B的多节点执行器;获得多节点执行器对象多节点执行器一;
步骤602,使用多节点执行器执行事务一;此处可以提交事务,也可以不提交事务,可由应用系统据业务自行决定;
步骤603,从连接池中获取所需的多节点执行器;此时连接池将据应用系统请求线程的标识,返回多节点执行器对象一,也就是刚才事务一所用的多节点执行器对象;
步骤604,使用多节点执行器执行事务四;此时由于获得的多节点执行器对象与事务一相同,所以当事务一未提交时,此处仍然可以进行SQL操作,最终与事务一中执行的SQL操作一同提交或者回滚,保障分布式事务的正确性。
从以上步骤可以看出,本发明对于应用系统同一线程完全可以分配相同的多节点执行器,以保障对多个数据库操作的正确性。并可以由应用程序决定提交的频度,最大程度地利用数据库的性能。
下面结合图7说明在本发明中,连接池如何为请求分配缓存的多节点执行器。连接池在接收到应用系统的请求时的流程如下:
步骤701,接收应用线程对多节点执行器的申请;
步骤702,该线程是否已有缓存的多节点执行器?接收到请求后,连接池将到维护的闲表、忙表中寻找是否已有缓存的多节点执行器,此处使用本发明提到的构造的HASH算法,据线程标识获得对应的多节点执行器;如果没有执行步骤703,否则执行步骤704;
步骤703,创建多节点执行器并进行缓存;据请求中的信息建立到各数据库的分布式连接,并创建多节点执行器对象,进行初始化;建立与请求线程标识的关联,并缓存该对象,同时放入忙对列;执行步骤705;
步骤704,把已缓存的多节点执行器分配给该线程;执行步骤705;
步骤705,返回多节点执行器给应用执行事务;连接池将确定的多节点执行器对象返回给应用系统使用,用以完成分布式事务操作。
以上对本发明的一个实施例进行了详细说明,但所述内容仅为本发明的较佳实施例,不能被认为用于限定本发明的实施范围。凡依本发明申请范围所作的均等变化与改进等,均应仍归属于本发明的专利涵盖范围之内。