一种用于数据库的写入互斥方法及装置的制造方法_3

文档序号:9687473阅读:来源:国知局
后可以退出,在必要的时候由其他模块(例如容灾模块)再次启动实施了本申请技术方案的新进程;或者本进程进入等待状态,等待其他模块通知其进入工作状态。不管采用何种方式,重新启动或者重新进入工作状态的进程,依然要执行上述步骤进行互斥检测。
[0073]步骤106:使用已创建的连接向所述目标数据库写入数据。
[0074]执行到本步骤,说明不存在与本进程同时向目标数据库执行写入操作的其他进程,因此可以使用已创建的连接向所述目标数据库写入数据。在具体实现中,为了向目标数据库写入数据,通常还需要执行相关的其他操作,例如,从源数据库读取数据,进行相应的处理,然后将处理后的数据写入目标数据库的数据库或表中。
[0075]此外,本步骤所述的写入操作,是相对宽泛的概念,是相对于数据库的读操作而言的。本步骤所述的写入操作可以是将从源数据库读取的数据写入目标数据库,也可以包括对目标数据库进行更改的其他操作,例如:插入行、删除行、修改行中的某个字段等。在本实施例的一个具体例子中,通过读取源数据库的binlog数据并进行解析、筛选等处理后,在目标数据库中执行相应的插入、删除、修改等操作,这些操作通常都会改变目标数据库中的数据,都属于本申请所述的写入操作。
[0076]为了提高向目标数据库写入数据的执行效率,本实施例的技术方案还提供了一种采用多个连接并行向目标数据库执行写入操作的方式。具体说,当步骤104的判断结果为“否”时,即:不存在不同于本地连接标识的其他连接标识,此时判断已创建的连接数目是否小于预先设定的连接数目,若是,按照预先设定的连接数目,依次创建用于向目标数据库写入数据的多条连接,然后使用已创建的多条连接向所述目标数据库写入数据。
[0077]在本实施例的上述具体例子中,预先设定的连接数目为32,在此前的步骤101中已经创建了 I条连接,因此在本步骤中循环调用mysql_connect O函数依次创建其余31条连接,随后由预先创建的32个线程分别使用其中的一条连接,向目标数据库并发执行写入数据的操作,从而提高数据写入过程的效率。
[0078]采用上述创建多条连接的实施方式,由于不同进程的执行在时间上是彼此独立的,导致在具体实施中可能存在这样一种比较极端的情况:在先启动的进程在步骤101中创建的连接因为某种原因被意外关闭了(例如采用kill命令强制该连接关闭),目标数据库不再存储与该连接相关的信息,并且该进程完成了互斥检测,但是还没有开始创建其他的连接,此时恰好另外一个执行同一写入任务的进程也启动了,由于在先进程的第一条连接被kill 了,而后续连接尚未建立,后启动进程没有检测到冲突,就会继续建立其他连接并且执行写入操作,而在先进程由于已经完成了互斥检测,因此也会继续创建连接并开始执行写入操作,这样就会出现两个进程同时向目标数据库执行相同写入操作的情况。
[0079]之所以会出现上面描述的情况,是因为在本步骤建立后续连接的过程中没有进行互斥检测,因此为了避免上述情况的出现,可以采用这样的实施方式:在本步骤106中每创建一条连接,都重复类似步骤101-步骤104的操作,检测当前是否存在其他执行同一写入任务进程创建的连接,一旦检测到,就关闭本进程所有已创建的连接,不执行向目标数据库写入数据的操作,从而同样可以实现本申请的技术方案,避免在上述极端情况下出现两个进程同时向目标数据库执行相同写入操作的情况。
[0080]上面通过步骤101-步骤106详细描述了本申请技术方案,在具体的应用中,还可以采用另外一种实施方式:在步骤101中,按照预先设定的连接数目,采用预先指定的统一的用户名依次创建用于向目标数据库写入数据的多条连接,然后执行后续的步骤102-106,进行互斥检测并根据检测结果进行相应的操作。其中在步骤102中,需要依次获取已创建的每条连接的连接标识,组成本地连接标识列表,在步骤104中,则需要判断是否存在满足下列条件的连接标识:该连接标识包含在从所述目标数据库获取的连接标识列表中、但是未包含在本地连接标识列表中。
[0081]采用这种实施方式,代码的功能划分比较清晰,但是一旦检测到冲突,需要将之前创建的多条连接依次关闭,存在对目标数据库连接资源的无谓占用,而且额外的处理操作也会对性能造成影响。但是从技术实现的角度,这种实施方式同样可以实现本申请的技术方案,避免两个执行同一写入任务的进程同时向目标数据库写入数据。
[0082]上面描述了本申请技术方案的一些【具体实施方式】,在具体应用中,还可能存在其他实施方式的变更,此处不一一列举,只要不偏离本申请技术方案的核心(即:在执行写入操作之前,利用目标数据库为每个连接分配唯一标识这一特性,检测是否存在其他执行同一写入任务的进程创建的连接,并且在不存在的情况下,才能继续执行后续的写入操作),那么这些实施方式的变更就依然在本申请的保护范围之内。
[0083]需要说明的是,在本实施例描述的具体例子中,所述目标数据库为MySQL数据库,因此采用的是MySQL C API提供的相关函数实现的创建连接、获取连接标识、获取指定用户名的连接标识列表、以及关闭连接等操作,相关的示例代码也仅仅是示意性的。在其他实施过程中,根据目标数据库的不同,以及运行平台的差异,可以采用不同于MySQL C API的其他接口,例如=SQL通用接口或者JDBC接口等,对于这些依赖于实施的具体细节,本申请技术方案不做具体的限定。
[0084]综上所述,本申请提供的一种用于数据库的写入互斥方法,充分利用了目标数据库具有的为每个连接分配唯一标识的特性,通过对连接标识的校验,可以获知是否已经存在其他进程创建的向目标数据库执行写入操作的连接,从而实现了互斥检测功能,避免两个进程同时向目标数据库执行同样的写入操作,有效保证目标数据库中的数据的正确性。
[0085]在上述的实施例中,提供了一种用于数据库的写入互斥方法,与之相对应的,本申请还提供一种用于数据库的写入互斥装置。请参看图2,其为本申请的一种用于数据库的写入互斥装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
[0086]本实施例的一种用于数据库的写入互斥装置,所述装置部署在向同一个目标数据库执行同一写入任务的设备中,包括:连接创建单元201,用于采用预先指定的统一的用户名创建用于向目标数据库写入数据的连接,所述目标数据库为每个与其建立的连接分配唯一的连接标识;本地标识获取单元202,用于获取已创建连接的连接标识,作为本地连接标识;标识列表获取单元203,用于获取所述目标数据库中采用所述用户名的所有连接的连接标识列表;连接标识判断单元204,用于判断所述连接标识列表中是否存在不同于所述本地连接标识的其他连接标识;连接关闭单元205,用于当所述连接标识判断单元的输出为“是”时,关闭已创建的连接;数据写入单元206,用于当所述连接标识判断单元的输出为“否”时,使用已创建的连接向所述目标数据库写入数据。
[0087]可选的,所述目标数据库为MySQL数据库。
[0088]可选的,所述连接创建单元具体用于,调用MySQL C API提供的mysql_connect O函数来创建向目标数据库写入数据的连接,并且在调用该函数时将用户名参数的值设置为所述预先指定的统一的用户名。
[0089]可选的,所述标识列表获取单元具体用于,执行SQL语句从PROCESSLIST表中查询采用所述用户名的所有连接的连接标识列表,所述PROCESSLIST表存储在目标MySQL数据库的 informat1n_schema 库中。
[0090]可选的,所述连接创建单元具体用于,按照预先设定的连接数目,依次创建用于向目标数据库写入数据的多条连接。
[0091]可选的,所述本地标识获取单元具体用于,依次获取已创建的每条连接的连接标识,组成本地连接标识列表。
[0092]可选的,所述连接标识判断单元具体用于,判断是否存在满足下列条件的连接标识:该连接标识包含在从所述目标数据库获取的连接标识列表中、但是未包含在本地连接标识列表中。
[0093]可选的,所述装置还包括:
[0094]连接数目判断单元,用于当所述连接标识判断单元的输出为“否”时,判断已创建的连接数目是否小于预先设定的连接数目;
[0095]连接循环创建单元,用于当所述连接数目判断单元的输出为“是”时,按照预先设定的连接数
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1