具体实施方式
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅配置为解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
参照图1,示出了本申请实施例一的数据库任务的处理方法的步骤流程图。
具体地,本实施例的数据库任务的处理方法包括以下步骤:
在步骤S101中,根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息。
本发明实施例提供的方案可应用于基于LSM结构的数据库,包括但不限于X-DB数据库、LevelDB数据库、RocksDB数据库等。
在本实施例中,所述写入请求可包括数据库事务写入请求,或者针对数据库的操作的写入请求等。所述数据库写入任务的信息可包括数据库事务对应的写入任务的信息,如,写日志信息、数据库事务的日志数据的刷盘信息、数据库事务的写内存信息,或者数据库事务的提交信息等。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,在确定所述写入请求对应的数据库写入任务的信息时,可对所述写入请求进行解析,以获得所述写入请求对应的数据库写入任务的信息。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在步骤S102中,对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务。
在一些可选实施例中,对所述数据库写入任务进行分解可以采用任意适当的方式实现,以获得所述数据库写入任务对应的多个子任务。一般来说,数据库写入任务可以分为多个不同的写入逻辑,每个写入逻辑又可以对应有多个子逻辑,基于此,可对数据库写入任务进行分解,以获得不同的写入逻辑和/或不同的子逻辑对应的子任务。例如,对于WAL写入任务,其可包括写活跃内存表任务、写冻结内存表任务、持久化存储任务等。又例如,某一写入任务一次可能写入一批数据,则可以将该写入任务分解为多个子任务,每个子任务写入其中的一部分数据,等等。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在步骤S103中,根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
每个任务的执行都需要一定的资源支持,本实施例中,对子任务进行分组以组成任务队列,以任务队列为单位分配资源,每组任务队列可以容纳多个(两个及两个以上)子任务。在需要将子任务写入任务队列时,可以根据各个任务队列的加锁情况,将子任务写入未加锁的任务队列。
在本实施例中,采用多组槽位Slot,每组Slot对应有一个任务队列。所述多个子任务可在任意组Slot对应的任务队列上尝试组织子任务的分组group。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,在根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列时,从所述多个任务队列中选择一个任务队列,判断选择的任务队列是否已被加锁;若已被加锁,则从剩余的任务队列中再选择一个任务队列,并将待加入的子任务加入再选择的任务队列;若未被加锁,则将所述待加入的子任务加入所述选择的任务队列。具体地,通过选择的任务队列的加锁标志位,判断选择的任务队列是否已被加锁,若判断选择的队列已被加锁,立即判断其他组槽位对应的任务队列是否已被加锁。籍此,通过对任务队列占用的资源进行加锁的方式,可保证该任务队列中加入的子任务的执行效率。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,可通过trylock机制,对任务队列占用的资源进行加锁。具体地,任务队列的执行线程以很轻量的方式先尝试加锁一次,如果加锁成功就正常执行。如果加锁失败,线程也不会阻塞,而是立即退出内核做其他任务。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述方法还包括:对于所述各个任务队列,为首个加入当前任务队列的子任务分配执行线程,其中,所述执行线程用于执行所述当前任务队列中的所有子任务。籍此,不需要为当前任务队列中的所有子任务都分配执行线程,减少了数据库系统的并发线程的数量,进而减少了数据库系统针对执行线程的工作状态的调度开销。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,为第一个进入槽位对应的任务队列的子任务分配执行线程,该执行线程用于执行该任务队列中的所有子任务。也就是说,该执行线程在该任务队列中处于“领导”地位。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述方法还包括:若所述当前任务队列中的所有子任务执行完毕,则对所述当前任务队列进行资源解锁;根据解锁后的所述当前任务队列的空闲等待时间和/或再次接收的子任务的信息,对所述当前任务队列对应的执行线程进行处理。其中,所述空闲等待时间可包括空闲等待时间段,所述再次接收的子任务的信息可包括再次接收的子任务的数量。籍此,在保证任务执行的同时,能够有效的节约数据库系统的计算资源。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,在根据解锁后的所述当前任务队列的空闲等待时间或再次接收的子任务的信息,对所述当前任务队列对应的执行线程进行处理,包括:若在所述空闲等待时间的时间段内未再次接收到新的子任务,则释放所述执行线程与所述当前任务队列的对应关系;若在所述空闲等待时间的时间段内再次接收到新的子任务,且所述新的子任务的数量达到预设阈值,则唤醒所述执行线程,并通过所述执行线程执行所述新的子任务。其中,所述空闲等待时间的时间段可由本领域技术人员根据实际需要进行设定,本申请实施例对此不做任何限定。所述预设阈值可由本领域技术人员根据实际需要进行设定,本申请实施例对此不做任何限定。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,若在所述空闲等待时间的时间段内未再次接收到新的子任务,则所述执行线程自发地由休眠状态切换至唤醒状态,然后释放所述执行线程与所述当前任务队列的对应关系。若在所述空闲等待时间的时间段内再次接收到新的子任务,且所述新的子任务的数量达到预设阈值,则通过为最后一个进入所述当前任务队列的所述新的子任务分配的辅助线程触发所述执行线程的唤醒。若在所述空闲等待时间的时间段内再次接收到新的子任务,且所述新的子任务的数量未达到预设阈值,则通过为最后一个进入所述当前任务队列的所述新的子任务分配的辅助线程触发所述执行线程的唤醒,并通过所述执行线程执行所述新的子任务。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
例如,针对每个Slot,第一个进入该Slot的写入请求将成为leader,为其分配执行线程,在一个Slot中已经有leader存在时,其他进入的写入请求成为follower,为其分配辅助线程,follower会将自己的写入请求交付给leader完成。在当前Slot中的leader释放该Slot的锁之后,会cond_wait一段时间(该时间可由本领域技术人员根据实际需求配置),如果等待时间内,leader收集的follower数目超过max_group_size(一个任务队列的最大容量),则leader被唤醒(由最后一个follower触发)。否则达到超时时间后,leader自己醒来,并切换其所在Slot的leader为空(即释放leader对应的执行线程与该Slot的关系)。
在一些可选实施例中,所述方法还包括:对于所述各个任务队列,为非首个加入所述当前任务队列的子任务分配辅助线程,其中,所述辅助线程用于将非首个子任务交给所述执行线程进行处理;判断所述辅助线程是否已成功将所述非首个子任务交给所述执行线程,若是,则分配所述辅助线程获取新的子任务。这种方式可以通过异步化API实现,follower在将其子任务交给leader后,可以立即返回去处理新的子任务。而leader完成follower的任务之后则可以调用一个回调函数完成当前任务队列的清理工作。籍此,不需要为当前任务队列中的所有子任务都分配执行线程,减少了数据库系统的并发线程的数量,进而减少了数据库系统针对执行线程的工作状态的调度开销。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。需要说明的是,若在同步模式下,follower在将其子任务交给leader后,需等待leader完成工作之后,再返回去处理新的子任务。
通过上述方式,在判断所述辅助线程已成功将所述非首个子任务交给所述执行线程之后,可使用异步化API,分配所述辅助线程获取新的子任务。通过将任务执行线程和任务执行过程解绑,使用更少的线程服务更多的任务,减少数据库系统的线程调度带来的有效计算资源的损耗。在所述执行线程完成所述当前任务队列中的所有子任务的处理之后,调用回调函数完成清理工作。在同步模式下,所述辅助线程将等待所述执行线程完成所述当前任务队列中的所有子任务的处理之后,再返回获取新的子任务。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
通过本申请实施例提供的数据库任务的处理方法,根据对数据库的写入请求,确定写入请求对应的数据库写入任务的信息,并对数据库写入任务进行分解,获得数据库写入任务对应的多个子任务,再根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将多个子任务并发写入多个任务队列,与现有的其它方式相比,能够减少数据库系统的计算资源的损耗,进而有效提高数据库系统的任务吞吐量。
本实施例的数据库任务的处理方法可以由任意适当的具有数据处理能力的设备执行,包括但不限于:摄像头、终端、移动终端、PC机、服务器、车载设备、娱乐设备、广告设备、个人数码助理(PDA)、平板电脑、笔记本电脑、掌上游戏机、智能眼镜、智能手表、可穿戴设备、虚拟显示设备或显示增强设备(如Google Glass、Oculus Rift、Hololens、Gear VR)等。
参照图2,示出了本申请实施例二的数据库任务的处理方法的步骤流程图。
具体地,本实施例的数据库任务的处理方法包括以下步骤:
在步骤S201中,根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息。
由于步骤S201与上述步骤S101类似,在此不再赘述。
在步骤S202中,对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务。
由于步骤S202与上述步骤S102类似,在此不再赘述。
在步骤S203中,根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
由于步骤S203与上述步骤S103类似,在此不再赘述。
在步骤S204中,若所述当前任务队列中的所有子任务均已执行完毕,则收集所有子任务对应的数据库事务日志数据,并生成对应的日志写入任务。
在本实施例中,所述当前任务队列的执行线程将所述当前任务队列中的所有子任务的数据库事务日志数据收集到任务的本地缓存中,并计算所述当前任务队列中的所有子任务的数据库事务日志数据的crc32校验数据。然后,生成对应的日志写入任务。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在步骤S205中,通过所述日志写入任务将所述数据库事务日志数据写入日志拷贝队列。
在一些可选实施例中,在通过所述日志写入任务将所述数据库事务日志数据写入日志拷贝队列时,所述方法还包括:为所述日志写入任务分配日志事务标识,根据所述日志事务标识判断所有日志写入任务是否全部完成。籍此,可通过日志事务标识判断所有日志写入任务是否全部完成。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,日志事务标识被记录下来存储至相应的变量中,作为该日志写入任务是否完成的依据。具体地,所述日志事务标识可为局部序列号。当当前线程是最后进入的一个线程时,其退出内核的前提条件是全局序列号大于或等于局部序列号,这样可以保证最后一个线程退出内核之前,所有日志写入任务都已经完成。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在步骤S206中,通过第一工作线程,将所述日志拷贝队列中的日志数据写入到用于存储日志数据的缓存中。
在本实施例中,通过第一工作线程,从所述日志拷贝队列中摘取数据库事务日志数据,并将所述数据库事务日志数据写入到用于存储日志数据的缓存中。所述第一工作线程可为前台线程或者后台线程。当所述第一工作线程可为后台线程时,可以做更精细的调度和任务分配。例如,固定分配写日志线程的数目根据机器物理CPU数目合理设置等。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述方法还包括:通过刷盘任务将所述缓存中的数据库事务日志数据发送至日志刷盘队列,以对所述数据库事务日志数据进行持久化存储;通过第二工作线程,对所述日志刷盘队列中的数据库事务日志数据进行持久化存储。籍此,能够确保日志刷盘队列中的数据库事务日志数据的持久化存储。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,所述第二工作线程可为前台线程或者后台线程。当所述第二工作线程可为后台线程时,可以做更精细的调度和任务分配。在将所述数据库事务日志数据写入到用于存储日志数据的缓存中之后生成对应的所述刷盘任务。然后,通过所述刷盘任务对所述缓存中的数据库事务日志数据进行持久化存储。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述通过刷盘任务将所述缓存中的日志数据发送至日志刷盘队列,包括:判断当前刷盘任务是否抢占到刷盘锁,若是,则通过所述当前刷盘任务将对应的所述日志数据发送至所述日志刷盘队列。籍此,能够实现对刷盘任务的抢占式执行。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,该刷盘任务只能有一个线程串行执行,因此设置了一个原子型的标志,来实现对任务的抢占式执行。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,在所述通过刷盘任务将所述缓存中的日志数据发送至日志刷盘队列的同时,所述方法还包括:记录所述日志数据对应的编号,并根据所述编号,将对应的日志数据发送至写内存表队列。籍此,能够确保将完成刷盘的日志数据发送至写内存表队列。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,第二工作线程会尝试对缓存中的数据库事务日志数据进行刷盘,当数据库事务日志数据的日志序列号有推进时,从日志刷盘队列中摘取满足条件的当数据库事务日志数据。具体地,当当前进行刷盘的数据库事务日志数据的日志序列号大于日志刷盘队列中的数据库事务日志数据的日志序列号时,从日志刷盘队列中摘取相应的数据库事务日志数据。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述方法还包括:通过多个写内存表任务,将所述写内存表队列中的日志数据并发写入内存表。籍此,能够将数据库事务日志数据并发写入内存表。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,在通过第二工作线程,对所述日志刷盘队列中的数据库事务日志数据进行持久化存储之后,生成对应的多个写内存表任务。然后,通过多个写内存表任务,将所述写内存表队列中的数据库事务日志数据并发写入内存表。该多个写内存表任务可以并发执行,大部分工作线程集中在这个地方,并发的从写内存表中获取数据库事务日志数据,并执行写内存表的操作。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述通过多个写内存表任务,将所述写内存表队列中的日志数据并发写入内存表,包括:获取已提交的写内存表任务的任务编号;将连续的多个任务编号中最大的任务编号确定为当前任务编号;根据当前任务编号判断所述多个写内存表任务是否全部完成。籍此,通过任务编号能够确保多个写内存表任务的完成。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,任务编号1,2,3,6对应的写内存表任务都已经执行完毕,但任务编号4,5对应的写内存表任务还未执行完,此时当前任务编号更新为3。当任务编号4,5对应的写内存表任务执行完之后,当前任务编号更新为6。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一些可选实施例中,所述方法还包括:通过多个提交任务对已提交的多个写内存表任务进行清理操作。籍此,能够对已提交的多个写内存表任务进行清理操作。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
在一个具体的例子中,当写内存表任务的任务编号推进时,达到提交条件的内存表任务会被推送到执行队列中。具体地,当当前任务编号为待提交的内存表任务的任务编号时,待提交的内存表任务会被推送到执行队列中进行清理操作。执行队列中内存表任务的清理操作可以并发执行。具体地,对内存表任务占用的计算资源进行放锁,并回收内存表任务占用的内存。更具体地,调用回调函数完成清理工作。在同步模式下,任务被提交后,需要唤醒等待任务提交的线程,并回包。在异步模式下,用回调函数完成任务的放锁,内存的释放。当单机存储引擎X-Engine作为MySQL数据库的一个引擎时,此处回调函数还需要完成向客户端的回包任务。可以理解的是,以上描述仅为示例性的,本申请实施例对此不做任何限定。
由此可见,通过拆分更小粒度的任务执行阶段,让IO设备的工作和CPU计算设备的工作达到均衡,互相不等待,从而数据库系统达到最高的任务吞吐量。
以下,以一个具体实例对上述过程进行示例性说明。例如,一个group(任务队列)从Slot中出队之后,该Slot的leader会将该Slot的所有follower的日志收集到大的writebatch中,同时计算好WAL日志的crc32校验;然后,将日志写入任务push到日志拷贝队列,此处push到日志拷贝队列的同时会为日志写入任务分配事务ID,此事务ID会记录下来存在local_expected_sequence_number中,作为该事务能否退出流水线的依据,当当前线程是流水线中最后进入的一个线程时,其退出的前提条件是全局global_version_sequence_number>=local_exptec_sequence_number,这样可以保证最后一个线程退出之前,所有任务队列都被清空。第一工作线程从拷贝日志队列中摘取日志写入任务写入的日志内容,将日志内容写入到WAL日志模块的buffer中,记录lsn(日志数据对应的编号),然后将写内存表的任务push到日志刷盘队列。该部分任务只能有一个线程串行执行,因此设置了一个原子型的flag,来实现对任务的抢占式执行。而对于日志刷盘队列,该队列中的任务,其日志内容已经写到日志buffer,但没有刷盘。工作线程会尝试去日志模块中对buffer进行刷盘,当日志文件的lsn有推进时,会从日志刷盘队列中摘取满足条件的(flush_lsn>append_lsn)任务,并push到write memtable队列。writememtable队列中的任务是都已经完成日志刷盘,等待写内存表的任务,该部分任务可以并发执行,大部分工作线程集中在这个地方,并发的从write_memtable_queue中获取任务并执行写内存表的操作。由于写到内存表中的数据,读取操作就可以读取到了,为了保证一致性,需要维护一个滑动窗口来负责更新全局读版本号,例如事务1,2,3,6都已经执行完毕,但事务4,5还未执行完,此时全局版本号更新为3。当4,5提交之后,全局版本号更新为6。当全局版本号推进时,达到提交条件的任务会被push到commit_queue中。commit_queue中的任务是需要完成提交、解锁和内存的回收等,该部分任务可以并发执行。在同步模式下,事务提交后,需要唤醒等待事务提交的线程,并回包。在异步模式下,用一个回调函数完成事务的放锁,内存的释放。当作为MySQL的一个引擎时,此处回调函数还需要完成向client端的回包任务。
在本申请实施例一的基础上,若当前任务队列中的所有子任务均已执行完毕,则收集所有子任务对应的数据库事务日志数据,并生成对应的日志写入任务,再通过日志写入任务将数据库事务日志数据写入日志拷贝队列,再通过第一工作线程,将日志拷贝队列中的数据库事务日志数据写入到用于存储日志数据的缓存中,与现有其它方式相比,能够将均已执行完毕的子任务对应的数据库事务日志数据写入到用于存储日志数据的缓存中,从而保证数据库任务执行的一致性。
本实施例的数据库任务的处理方法可以由任意适当的具有数据处理能力的设备执行,包括但不限于:摄像头、终端、移动终端、PC机、服务器、车载设备、娱乐设备、广告设备、个人数码助理(PDA)、平板电脑、笔记本电脑、掌上游戏机、智能眼镜、智能手表、可穿戴设备、虚拟显示设备或显示增强设备(如Google Glass、Oculus Rift、Hololens、Gear VR)等。
参照图3,示出了本申请实施例三中数据库任务的处理装置的结构示意图。
本实施例的数据库任务的处理装置包括:确定模块301,用于根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息;分解模块302,用于对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务;并发写入模块303,用于根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
本实施例的数据库任务的处理装置用于实现前述多个方法实施例中相应的数据库任务的处理方法,并具有相应的方法实施例的有益效果,在此不再赘述。
参照图4,示出了本申请实施例四中数据库任务的处理装置的结构示意图。
本实施例的数据库任务的处理装置包括:确定模块401,用于根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息;分解模块402,用于对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务;并发写入模块403,用于根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
可选地,所述并发写入模块403,具体用于:从所述多个任务队列中选择一个任务队列,判断选择的任务队列是否已被加锁;若已被加锁,则从剩余的任务队列中再选择一个任务队列,并将待加入的子任务加入再选择的任务队列;若未被加锁,则将所述待加入的子任务加入所述选择的任务队列。
可选地,所述装置还包括:第一分配模块404,用于对于所述各个任务队列,为首个加入当前任务队列的子任务分配执行线程,其中,所述执行线程用于执行所述当前任务队列中的所有子任务。
可选地,所述装置还包括:资源解锁模块405,用于若所述当前任务队列中的所有子任务执行完毕,则对所述当前任务队列进行资源解锁;处理模块406,用于根据解锁后的所述当前任务队列的空闲等待时间和/或再次接收的子任务的信息,对所述当前任务队列对应的执行线程进行处理。
可选地,所述处理模块406,具体用于:若在所述空闲等待时间的时间段内未再次接收到新的子任务,则释放所述执行线程与所述当前任务队列的对应关系;若在所述空闲等待时间的时间段内再次接收到新的子任务,且所述新的子任务的数量达到预设阈值,则唤醒所述执行线程,并通过所述执行线程执行所述新的子任务。
可选地,所述装置还包括:第二分配模块407,用于对于所述各个任务队列,为非首个加入所述当前任务队列的子任务分配辅助线程,其中,所述辅助线程用于将非首个子任务交给所述执行线程进行处理;第三分配模块408,用于判断所述辅助线程是否已成功将所述非首个子任务交给所述执行线程,若是,则分配所述辅助线程获取新的子任务。
本实施例的数据库任务的处理装置用于实现前述多个方法实施例中相应的数据库任务的处理方法,并具有相应的方法实施例的有益效果,在此不再赘述。
参照图5,示出了本申请实施例五中数据库任务的处理装置的结构示意图。
本实施例的数据库任务的处理装置包括:确定模块501,用于根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息;分解模块502,用于对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务;并发写入模块503,用于根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
可选地,所述装置还包括:收集模块504,用于若所述当前任务队列中的所有子任务均已执行完毕,则收集所有子任务对应的数据库事务日志数据,并生成对应的日志写入任务;第一写入模块505,用于通过所述日志写入任务将所述日志数据写入日志拷贝队列;第二写入模块506,用于通过第一工作线程,将所述日志拷贝队列中的日志数据写入到用于存储日志数据的缓存中。
可选地,所述装置还包括:第四分配模块507,用于为所述日志写入任务分配日志事务标识;判断模块508,用于根据所述日志事务标识判断所有日志写入任务是否全部完成。
可选地,所述装置还包括:发送模块509,用于通过刷盘任务将所述缓存中的日志数据发送至日志刷盘队列,以对所述日志数据进行持久化存储;持久化存储模块510,用于通过第二工作线程,对所述日志刷盘队列中的日志数据进行持久化存储。
可选地,所述发送模块509,具体用于:判断当前刷盘任务是否抢占到刷盘锁,若是,则通过所述当前刷盘任务将对应的所述日志数据发送至所述日志刷盘队列。
可选地,所述装置还包括:记录模块511,用于记录所述日志数据对应的编号,并根据所述编号,将对应的日志数据发送至写内存表队列。
可选地,所述装置还包括:第三写入模块512,用于通过多个写内存表任务,将所述写内存表队列中的日志数据并发写入内存表。
可选地,所述第三写入模块512,具体用于:获取已提交的写内存表任务的任务编号;将连续的多个任务编号中最大的任务编号确定为当前任务编号;根据当前任务编号判断所述多个写内存表任务是否全部完成。
可选地,所述装置还包括:清理模块513,用于通过多个提交任务对已提交的多个写内存表任务进行清理操作。
本实施例的数据库任务的处理装置用于实现前述多个方法实施例中相应的数据库任务的处理方法,并具有相应的方法实施例的有益效果,在此不再赘述。
图6为本申请实施例六中电子设备的结构示意图;该电子设备可以包括:
一个或多个处理器601;
计算机可读介质602,可以配置为存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述实施例一或实施例二所述的数据库任务的处理方法。
图7为本申请实施例七中电子设备的硬件结构;如图7所示,该电子设备的硬件结构可以包括:处理器701,通信接口702,计算机可读介质703和通信总线704;
其中处理器701、通信接口702、计算机可读介质703通过通信总线704完成相互间的通信;
可选地,通信接口702可以为通信模块的接口,如GSM模块的接口;
其中,处理器701具体可以配置为:根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息;对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务;根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
处理器701可以是通用处理器,包括中央处理器(Central Processing Unit,简称CPU)、网络处理器(Network Processor,简称NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
计算机可读介质703可以是,但不限于,随机存取存储介质(Random AccessMemory,RAM),只读存储介质(Read Only Memory,ROM),可编程只读存储介质(Programmable Read-Only Memory,PROM),可擦除只读存储介质(Erasable ProgrammableRead-Only Memory,EPROM),电可擦除只读存储介质(Electric Erasable ProgrammableRead-Only Memory,EEPROM)等。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含配置为执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。在该计算机程序被中央处理单元(CPU)执行时,执行本申请的方法中限定的上述功能。需要说明的是,本申请所述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读介质例如可以但不限于是电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储介质(RAM)、只读存储介质(ROM)、可擦式可编程只读存储介质(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储介质(CD-ROM)、光存储介质件、磁存储介质件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输配置为由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写配置为执行本申请的操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络:包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个配置为实现规定的逻辑功能的可执行指令。上述具体实施例中有特定先后关系,但这些先后关系只是示例性的,在具体实现的时候,这些步骤可能会更少、更多或执行顺序有调整。即在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括确定模块、分解模块和并发写入模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,确定模块还可以被描述为“根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息的模块”。
作为另一方面,本申请还提供了一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如上述实施例一或实施例二所描述的数据库任务的处理方法。
作为另一方面,本申请还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的装置中所包含的;也可以是单独存在,而未装配入该装置中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该装置执行时,使得该装置:根据对数据库的写入请求,确定所述写入请求对应的数据库写入任务的信息;对所述数据库写入任务进行分解,获得所述数据库写入任务对应的多个子任务;根据对多个任务队列中各个任务队列占用的资源的加锁检测结果,将所述多个子任务并发写入所述多个任务队列。
在本公开的各种实施方式中所使用的表述“第一”、“第二”、“所述第一”或“所述第二”可修饰各种部件而与顺序和/或重要性无关,但是这些表述不限制相应部件。以上表述仅配置为将元件与其它元件区分开的目的。例如,第一用户设备和第二用户设备表示不同的用户设备,虽然两者均是用户设备。例如,在不背离本公开的范围的前提下,第一元件可称作第二元件,类似地,第二元件可称作第一元件。
当一个元件(例如,第一元件)称为与另一元件(例如,第二元件)“(可操作地或可通信地)联接”或“(可操作地或可通信地)联接至”另一元件(例如,第二元件)或“连接至”另一元件(例如,第二元件)时,应理解为该一个元件直接连接至该另一元件或者该一个元件经由又一个元件(例如,第三元件)间接连接至该另一个元件。相反,可理解,当元件(例如,第一元件)称为“直接连接”或“直接联接”至另一元件(第二元件)时,则没有元件(例如,第三元件)插入在这两者之间。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。