基于数据库的任务执行方法及装置 【技术领域】
本发明涉及通信领域, 具体而言, 涉及一种基于数据库的任务执行方法及装置。背景技术 在应用软件开发过程中, 常常用到关系型数据库以便存储和处理数据。在相关技 术中, 通常在数据库的一个数据库连接中串行执行各个数据处理的任务, 这种处理方式执 行任务效率低, 并且当任务处理发生错误时, 需要全部重新执行, 也不能从错误发生处恢复 执行。
为此, 相关技术中提出了一种多个数据库任务并行执行的方法, 其将数据处理的 任务划分到不同分组内, 归属于不同分组的任务之间并行执行, 各分组中的任务相互独立, 从而减少了任务之间的依赖性, 缩短了执行任务所需的时间。
但是, 这种方法存在以下不足 : 该方法中组和组之间实现了并行执行, 但组内子任 务仍是串行执行, 不能实现具有复杂的执行依赖关系的任务的执行, 例如, 若某个任务 C 的
前置任务是并行的两个任务 A 和任务 B, 则该方法不能实现 A 任务和 B 任务并行执行后, 再 执行 C 任务的数据处理的情况 ; 另外, 这种方法预先进行分组, 每组执行任务的执行顺序固 定, 且分组的数量固定, 也就是说, 数据处理的并发度是固定的, 不能随硬件资源而动态调 整。 发明内容 本发明的主要目的在于提供一种基于数据库的任务执行方法及装置, 以至少解决 上述问题。
根据本发明的一个方面, 提供了一种基于数据库的任务执行方法, 包括 : 加入数据 库连接 ; 数据库连接从任务组中获取待执行的任务 ; 以及判断获取的任务的前置任务是否 全部执行成功, 若是, 则数据库连接执行获取的任务, 否则, 数据库连接继续从任务组中获 取待执行的任务。
进一步地, 数据库连接从任务组中获取待执行的任务包括 : 数据库连接对任务组 的查询操作类型的记录行加锁 ; 数据库连接获取到满足预定条件的任务, 其中, 预定条件包 括: 获取的任务的执行结果状态为初始化或重新打开 ; 数据库连接将获取的任务的执行结 果状态设置为选中 ; 数据库连接对查询操作类型的记录行解锁。
进一步地, 判断获取的任务的前置任务未全部执行成功之后, 还包括 : 数据库连接 将获取的任务的执行结果状态置为重新打开。
进一步地, 将获取的任务的执行结果状态置为重新打开的同时, 还将获取的任务 加入前置任务临时表, 预定条件还包括获取的任务不在前置任务临时表中。
进一步地, 执行获取的任务包括 : 数据库连接将获取的任务的执行结果状态置为 运行, 并执行获取的任务的运行指令。
进一步地, 在执行获取的任务的运行指令成功的情况下, 还包括 : 数据库连接对任
务组的删除操作类型的记录行加锁 ; 数据库连接将获取的任务的执行结果状态置为成功, 并删除前置任务临时表中的任务 ; 数据库连接对任务组的删除操作类型的记录行解锁。
进一步地, 在执行获取的任务的运行指令失败的情况下, 还包括 : 数据库连接将获 取的任务的执行结果状态置为失败, 并将获取的任务的后置任务的执行结果状态置为依赖 性失败。
进一步地, 在数据库连接从当前任务组中获取待执行的任务失败, 或者, 执行获取 的任务之后, 还包括 : 判断执行成功的任务数量和执行失败的任务数量之和是否等于任务 组中的任务总数, 或者, 判断用户是否发出停止指令, 若是, 则停止执行, 否则, 返回从任务 组中获取待执行的任务的步骤。
进一步地, 数据库连接从当前任务组中获取待执行的任务失败包括 : 数据库连接 接收到用于指示加锁等待超时的通知 ; 或者, 数据库连接接收到用于指示任务组中不存在 待执行的任务的通知。
进一步地, 判断获取的任务的前置任务是否全部执行成功包括 : 根据预先设置的 任务组中任务之间的依赖关系确定获取的任务的前置任务 ; 判断前置任务是否全部执行成 功。
根据本发明的另一个方面, 提供了一种基于数据库的任务执行装置, 包括 : 加入模 块, 用于加入数据库连接 ; 获取模块, 用于从任务组中获取待执行的任务 ; 判断模块, 用于 判断获取的任务的前置任务是否全部执行成功 ; 调度模块, 用于在判断模块的判断结果为 是的情况下, 调度执行模块, 在判断模块的判断结果为否的情况下, 调度获取模块 ; 执行模 块, 用于执行获取的任务。
通过本发明, 采用加入的数据库连接从任务组中获取待执行的任务, 并判断该任 务的前置任务是否全部执行成功, 若是, 则执行所述获取的任务, 否则, 继续从任务组中获 取待执行的任务, 解决了相关技术中数据处理并发度固定导致处理灵活度低的问题, 能够 动态控制数据处理的并发度。 附图说明 此处所说明的附图用来提供对本发明的进一步理解, 构成本申请的一部分, 本发 明的示意性实施例及其说明用于解释本发明, 并不构成对本发明的不当限定。在附图中 :
图 1 是根据本发明实施例的基于数据库的任务执行方法的流程图 ;
图 2 是根据本发明实施例的基于数据库的任务执行装置的结构框图 ;
图 3 是根据本发明实施例 1 的用于实现基于数据库的任务执行方法的装置的详细 结构框图 ;
图 4 是根据本发明实施例 2 的执行模块中各子模块的执行过程的流程图 ;
图 5 是根据本发明实施例 4 的具有网状依赖关系的任务的组成结构示意图。
具体实施方式
下文中将参考附图并结合实施例来详细说明本发明。需要说明的是, 在不冲突的 情况下, 本申请中的实施例及实施例中的特征可以相互组合。
图 1 是根据本发明实施例的基于数据库的任务执行方法的流程图, 该方法包括以下步骤 :
步骤 S102, 加入数据库连接 ;
步骤 S104, 该数据库连接从任务组中获取待执行的任务 ; 以及
步骤 S106, 判断获取的任务的前置任务是否全部执行成功, 若是, 则该数据库连接 执行获取的任务, 否则, 该数据库连接继续从任务组中获取待执行的任务。
相关技术中, 采用预先将待执行的任务分组, 在组内通过串行方式执行该组中的 任务, 不同组之间的任务并行执行的方式, 实现了数据的并发处理, 但是, 该方法需要预先 规定并发连接数量, 无法实现灵活配置, 而且无法支持对混合关系的任务的执行。 本发明实 施例提供的方法中, 新加入的数据库连接首先获取待执行的任务, 再根据对前置任务是否 全部执行成功的判断结果, 决定后续处理。 该方法中, 数据库连接可以在任何时候加入, 即, 在数据处理的过程中, 随时可以加入用于处理任务的线程, 支持数据库连接的动态增加或 减少, 从而动态地调整数据处理的并发度。另外, 通过判断前置任务是否全部执行成功, 保 证了混合关系任务的执行逻辑, 能够实现网状依赖关系的数据计算。
优选地, 步骤 S104 可以包括 :
步骤 S1042, 数据库连接对任务组的查询操作类型的记录行加锁 ; 步骤 S1044, 数据库连接获取到满足预定条件的任务, 其中, 预定条件包括 : 获取 的任务的执行结果状态为初始化或重新打开 ;
步骤 S1046, 数据库连接将获取的任务的执行结果状态设置为选中 ;
步骤 S1048, 数据库连接对查询操作类型的记录行解锁。
通过该方法, 能够保证一个待执行的任务在同一时刻仅被一个数据库连接获取, 防止不同的数据库连接获取到相同的任务所导致的执行混乱, 保证了系统的健壮性。
优选地, 判断获取的任务的前置任务未全部执行成功之后, 还包括 : 数据库连接将 获取的任务的执行结果状态置为重新打开。通过该方法, 能够保证后续的数据库连接 ( 可 能为该数据库连接本身 ) 获取到该任务。
优选地, 将获取的任务的执行结果状态置为重新打开的同时, 还将获取的任务加 入前置任务临时表, 预定条件还包括获取的任务不在前置任务临时表中。通过该方法的设 定, 能够防止该数据库连接反复抓取同一个前置任务未全部执行成功的任务, 最终导致该 数据库连接在一段时间内进入无意义的循环状态的情况, 提高了数据库连接的处理效率。
优选地, 执行获取的任务的过程包括 : 数据库连接将获取的任务的执行结果状态 置为运行, 并执行获取的任务的运行指令。 通过将该任务的执行结果状态置为运行, 可以保 证该任务在运行过程中不会被其他的数据库连接抓取到, 保证了系统的健壮性。
优选地, 在执行获取的任务的运行指令成功的情况下, 还包括 : 数据库连接对任务 组的删除操作类型的记录行加锁 ; 数据库连接将获取的任务的执行结果状态置为成功, 并 删除前置任务临时表中的任务 ; 数据库连接对任务组的删除操作类型的记录行解锁。通过 在执行成功的情况下, 删除前置任务临时表中的任务, 保证了数据库连接能够继续尝试抓 取之前抓取又释放的任务 ( 该任务的前置任务在当时未全部执行成功 ), 提高了系统的运 行效率, 并且, 通过删除锁的机制, 防止多个数据库连接同时执行删除操作, 保证了系统的 健壮性。
优选地, 在执行获取的任务的运行指令失败的情况下, 还包括 : 数据库连接将获取
的任务的执行结果状态置为失败, 并将获取的任务的后置任务的执行结果状态置为依赖性 失败。通过设置当前获取的任务以及其后置任务的执行状态, 能够防止以上任务被再次抓 取到, 在任务无法执行成功的情况下, 防止浪费系统的资源, 同时, 能够标识出现失败的任 务, 以便后续从该失败任务处继续执行, 提高了系统的运行效率。
优选地, 在数据库连接从当前任务组中获取待执行的任务失败, 或者, 执行获取的 任务之后, 还包括 : 判断执行成功的任务数量和执行失败的任务数量之和是否等于任务组 中的任务总数, 或者, 判断用户是否发出停止指令, 若是, 则停止执行, 否则, 返回从任务组 中获取待执行的任务的步骤。该方法能够自动判断是否停止执行, 或者根据用户的指令来 确定是否停止执行, 提高了系统的可控性。
优选地, 数据库连接从当前任务组中获取待执行的任务失败包括 : 数据库连接接 收到用于指示加锁等待超时的通知 ; 或者, 数据库连接接收到用于指示任务组中不存在待 执行的任务的通知。在数据库连接加锁等待超时或任务组中不存在需要执行的任务的时 候, 判断是否需要停止执行, 能够防止系统资源的浪费。
优选地, 判断获取的任务的前置任务是否全部执行成功包括 : 根据预先设置的任 务组中任务之间的依赖关系确定获取的任务的前置任务 ; 判断前置任务是否全部执行成 功。通过该方法, 依照任务之间的关系来执行任务, 能够实现串行关系、 并行关系以及串行 和并行混合关系的任务的执行。 图 2 是根据本发明实施例的基于数据库的任务执行装置的结构框图, 该装置包 括: 加入模块 21, 用于加入数据库连接 ; 获取模块 22, 用于从任务组中获取待执行的任务 ; 判断模块 23, 用于判断获取的任务的前置任务是否全部执行成功 ; 调度模块 24, 用于在判 断模块 23 的判断结果为是的情况下, 调度执行模块 25, 在判断模块 23 的判断结果为否的情 况下, 调度获取模块 22 ; 执行模块 25, 用于执行获取的任务。
相关技术中需要预先规定并发连接数量, 无法实现灵活配置, 而且无法支持对混 合关系的任务的执行。本发明实施例提供的装置中, 新加入的数据库连接首先执行获取模 块 22, 获取待执行的任务, 再根据判断模块 23 进行的前置任务是否全部执行成功的判断结 果, 决定后续处理。 数据库连接可以在任何时候加入, 即, 在数据处理的过程中, 随时可以加 入用于处理任务的线程, 支持数据库连接的动态增加或减少, 从而动态地调整数据处理的 并发度。另外, 通过判断模块 23 判断前置任务是否全部执行成功, 保证了混合关系任务的 执行逻辑, 能够实现网状依赖关系的数据计算。
下面描述的实施例 1-4, 综合了上述多个优选实施例的技术方案。
实施例 1
图 3 是根据本发明实施例 1 的用于实现基于数据库的任务执行方法的装置的详细 结构框图, 该装置包括 : 输入模块、 执行模块和输出模块三部分, 其中 :
(1) 输入模块, 用于接受将执行任务数据输入到任务表, 将任务依赖关系数据输入 到任务关系表, 以及将加锁用途数据输入到任务锁表的操作。 优选地, 输入模块还可以用于 产生一个任务组, 指定一个任务组标签, 以任务组标签作为组标识以实现混合执行的数据 隔离。
具体地, 执行任务数据包含序号、 任务组、 任务名、 任务执行指令、 执行结果状态 等; 任务依赖数据包含序号、 前置任务名、 后续任务名、 任务组的信息数据等 ; 任务锁数据
包含序号、 锁名、 锁类型、 任务组的信息数据等。输入模块为每个任务组产生增加、 删除、 修 改、 查询操作类型的四行记录。
需要说明的是, 在包含混合关系类型的任务的情况下, 任务依赖数据包含的前置 任务名可能有多个。
(2) 执行模块, 用于按照任务依赖关系数据, 实现多个数据库连接混合执行多个任 务。具体地, 如图 4 所示, 该模块包含了四个子模块, 分别为任务获取子模块、 依赖控制子模 块、 执行任务子模块、 退出控制子模块。
执行模块中, 一个数据库连接先执行任务获取子模块获得一个执行任务, 然后执 行依赖控制子模块, 分析获得任务的执行依赖关系, 分析该任务是否可以执行, 若可以执 行, 再执行执行任务子模块, 获得任务运行指令, 执行任务运行指令 ; 最后执行退出控制子 模块, 分析一个数据库连接是否能退出执行模块, 不再做执行执行。
(3) 输出模块, 用于输出任务执行结果和任务节点展现、 节点布局数据等。
在该基于数据库的任务执行装置中, 先执行输入模块, 以便输入任务数据和任务 依赖关系数据 ; 然后启动多个数据库连接 ; 每个数据库连接执行执行模块的一个函数, 完 成各个任务的执行, 以便根据依赖关系实现混合执行 ; 最后执行输出模块, 输出任务执行结 果和任务节点展现、 节点布局数据等。 实施例 2
以下结合实施例 1 中提供的基于数据库的任务执行装置的结构描述基于数据库 的任务执行方法, 该方法包括以下步骤 :
步骤 1, 一个数据库连接执行输入模块, 该输入模块生成一个任务组, 接受执行任 务、 任务关系数据的输入, 并给每个任务组产生用于加锁的四行记录。
步骤 2, 一个数据库连接执行执行模块, 具体地, 如图 4 所示, 按照以下的顺序执行 执行模块中的各子模块 :
1) 一个数据库连接对任务组的查询操作类型的记录行整行加锁 ;
2) 一个数据库连接从该任务组的执行任务数据中取得一个没有执行的任务, 该任 务是满足运行错误代码等于 -1, 错误次数小于 5 次 ( 可配置 ), 任务执行结果状态是初始化 和重新打开, 且不在前置任务临时表中的任务 ; 当没有执行任务时, 返回一个 “NOTASK” 标 签的任务, 当加锁等待超时, 返回一个 “TIMEOUT” 标签的任务 ;
3) 该数据库连接对该任务组的查询操作标签的记录行解锁 ;
4) 若步骤 2) 中数据库连接得到一个执行任务, 则直接进入步骤 5) 执行依赖控制 子模块 ; 若步骤 2) 中数据库连接获取到的是 “NOTASK” 标签的任务或 “TIMEOUT” 标签的任 务, 则直接转入步骤 9) 执行退出控制子模块 ;
5) 依赖控制子模块功能根据任务关系表分析步骤 2) 中获取的任务是否有前置任 务在等待, 具体地, 判断全部的前置任务是否都执行成功了, 若判断结果是真, 直接进入步 骤 6) 执行执行任务子模块, 若判断结果是假, 则释放该任务, 将该任务的执行结果状态设 置成重新打开, 同时把数据插入前置任务临时表, 防止本数据库连接和其他数据库连接重 新抓取到该任务, 直接进入步骤 9) 执行退出控制子模块 ;
6) 一个数据库连接将获取到的任务的执行结果状态更新为运行, 并执行该任务的 运行指令 ;
7) 若该任务执行成功, 则该数据库连接对该任务组的删除操作标签的记录行整 行加锁, 得到该锁后, 更新该任务的执行结果状态为成功, 同时把前置任务临时表中本连接 数据删除, 其他连接的后续任务全部删除 ; 若该任务运行失败, 错误次数小于 5 次, 更新该 任务的执行结果状态是重新打开, 错误次数加上 1, 当错误次数等于 5 次, 该任务的后续任 务的执行结果状态设置成依赖性失败, 运行次数等于 100, 该任务的执行结果状态设置成失 败, 运行次数等于 5 ;
8) 该数据库连接对该任务组的删除操作标签的记录行解锁。
9) 一个数据库连接分析任务表数据, 当执行任务的成功个数加上执行任务的失败 个数等于总执行任务数, 或者, 用户干预发出停止指令, 则设置轮询条件为假, 退出执行模 块; 否则, 在轮询条件为真的情况下, 继续轮询执行, 执行下一次轮询执行, 即, 返回步骤 1) 继续执行。
步骤 3, 一个数据库连接执行输出模块, 输出任务执行结果、 任务节点展现、 节点布 局数据等。
实施例 3
该实施例描述了一种具体实现过程中, 用户通过该基于数据库的任务执行装置实 现混合关系运算的过程 :
步骤 1, 用数据库客户端工具或应用, 连接到数据库, 执行录入模块, 输入执行任务 数据、 输入任务关系数据, 或者, 任务数据和任务关系数据预先已经进入临时表, 仅仅将临 时表的内容更新到任务表和任务关系表。
步骤 2, 用数据库客户端工具或应用, 连接到数据库, 执行执行模块的接口函数 sp_set_loop, 参数是任务组名称, 启动了一个执行数据库连接。
步骤 3, 用与步骤 2 相同的方式, 启动其他数据库连接, 实现多任务混合执行。
需要说明的是, 上述方法中以任务组来隔离数据, 在数据库资源许可的前提下, 可 以同时多个任务组工作, 工作组之间独立工作, 以便应用于不同项目的数据处理。
实施例 4
图 5 是根据本发明实施例 4 的具有网状依赖关系的任务的组成结构示意图, 如图 5 所示, 该任务组包含了 9 个任务, 该实施例结合以上实施例 1-3 提供的方案, 对具有如图 5 所示的任务关系的任务组进行处理的详细过程进行了描述, 包括以下的步骤 :
步骤 1, 开始计算时, 通过实施例 3 步骤 2 中所述的启动数据库连接的方式, 启动了 一个数据库连接 ( 记为进程 a) 处理任务 ;
步骤 2, 按照任务的层级值, 先后执行 A、 E、 G 任务 (A、 E、 G 任务的层级相同, 先后顺 序可以随机确定, 或者, 按照其他预先设定的规则进行确定 ) ;
步骤 3, 进程 a 获取了符合实施例 2 中描述的规则的 B 任务, 判定其前置任务 A 任 务执行成功, 则执行 B 任务 ;
步骤 4, 通过实施例 3 步骤 2 中所述的启动数据库连接的方式, 又增加了一个数据 库连接 ( 记为进程 b) ;
步骤 5, 进程 b 获取任务, 按照任务间依赖关系, 能够满足前置任务均执行成功的 条件的任务仅有 F 或者是 H 任务, 假定进程 b 将获取的 F 任务送入依赖控制子单元, 依赖控 制子单元判定 F 任务可执行, 则进程 b 执行 F 任务 ; 在进程 b 执行 F 任务的同时, 进程 a 执行完了 B 任务, 进程 a 获取了 H 任务, 按照任务间依赖关系, H 任务满足执行条件, 则进程 a 执行 H 任务 ;
步骤 6, 进程 a 已执行完了 H 任务, 但是进程 b 执行的 F 任务尚未完成, 进程 a 进行 任务抓取后, 判断抓取到的任务不满足前置任务已执行成功的条件, 不能执行抓取到的任 务, 则进行等待, 优选地, 还可以将抓取到的任务加入前置任务临时表 ;
步骤 7, 进程 b 执行完 F 任务后, 进程 a 选择到 C 任务后执行, 进程 b 选择到 K 任务 后执行 ;
步骤 8, 进程 a 完成 C 任务后, 抓取到 D 任务, 但是 D 任务的前置任务 K 尚在执行 中, 进程 a 没有任务可做, 在等待, 优选地, 可以将任务 D 加入前置任务临时表 ;
步骤 9, 进程 b 完成 K 任务后, 进程 b 选择到 D 任务, 进程 a 在等待 ;
步骤 10, 进程 b 完成 D 任务后, 退出控制子单元判定进程 b 应当退出计算, 则进程 b 会话结束, 同时, 退出控制子单元判定进程 a 应当退出计算, 进程 a 会话结束。
综上所述, 本发明实施例提供的方案在数据处理的过程中, 随时可以加入用于处 理任务的线程, 支持数据库连接的动态增加或减少, 从而能够动态的调整数据处理的并发 度, 并且, 能够实现网状依赖关系的数据计算。 另外, 该方法仅需要一个关系型数据库, 不需 要格外的应用服务支持即可实现, 使用简单。 需要说明的是, 在附图的流程图示出的步骤可以在诸如一组执行机可执行指令的 执行机系统中执行, 并且, 虽然在流程图中示出了逻辑顺序, 但是在某些情况下, 可以以不 同于此处的顺序执行所示出或描述的步骤。
显然, 本领域的技术人员应该明白, 上述的本发明的各模块或各步骤可以用通用 的执行装置来实现, 它们可以集中在单个的执行装置上, 或者分布在多个执行装置所组成 的网络上, 可选地, 它们可以用执行装置可执行的程序代码来实现, 从而, 可以将它们存储 在存储装置中由执行装置来执行, 或者将它们分别制作成各个集成电路模块, 或者将它们 中的多个模块或步骤制作成单个集成电路模块来实现。这样, 本发明不限制于任何特定的 硬件和软件结合。
以上所述仅为本发明的优选实施例而已, 并不用于限制本发明, 对于本领域的技 术人员来说, 本发明可以有各种更改和变化。 凡在本发明的精神和原则之内, 所作的任何修 改、 等同替换、 改进等, 均应包含在本发明的保护范围之内。