发明内容
本发明实施例提供了一种处理数据库重做数据的方法和装置,用于提高重做数据的处理性能。
第一方面,本发明实施例提供了一种处理数据库重做数据的方法,应用于服务器中,所述服务器中运行有数据读取线程以及多个应用线程,所述多个应用线程以并发的方式修改数据库,所述方法包括:所述多个应用线程中每一应用线程根据修改数据库的操作生成重做数据,并将所述重做数据相应保存到为所述每一应用线程分配的缓存中,获取时序队列锁后将所述应用线程的标识保存到时序队列,所述保存结束后释放所述时序队列锁;所述数据读取线程确定数据读取条件得到满足,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
在第一方面的第一种可能的实现方式中,所述数据读取条件为到达预定的时间周期,或所述时序队列的长度达到预定值,或所述应用线程的缓存数据量达到预定值。
结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前,进一步包括获取所述重做队列的队列锁,以获得对所述重做队列的写入权限;所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后,进一步包括释放所述重做队列的队列锁。
结合第一方面或第一方面的第一种可能的实现方式或第一方面的第二种可能的实现方式,在第三种可能的实现方式中,该方法还包括:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前还包括获取所述时序队列的队列锁以锁定所述时序队列,以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后还包括释放所述时序队列的队列锁;或者所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前还包括给所述时序队列的队尾元素添加读取结束标识。
结合第一方面以及第一方面的第一至第三种可能的实现方式中的任意一个,在第四种可能的实现方式中,该方法还包括:所述从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后还包括将所述应用线程的标识从所述时序队列中删除。
第二方面,本发明实施例提供了一种处理数据库重做数据的服务器,所述服务器中运行有多个应用线程,所述多个应用线程以并发的方式修改数据库,所述服务器包括:
时序队列处理单元,用于在所述多个应用线程中每一应用线程根据修改数据库的操作生成重做数据,并将所述重做数据相应保存到为所述每一应用线程分配的缓存中,获取时序队列锁后将所述应用线程的标识保存到时序队列,所述保存结束后释放所述时序队列锁以及将所述时序队列发送到重做队列处理单元;
所述重做队列处理单元,用于从所述时序队列处理单元接收所述时序队列,以及确定数据读取条件得到满足后,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
在第一方面的第一种可能的实现方式中,所述重做队列处理单元确定满足数据读取条件具体包括:所述重做队列处理单元确定到达预定的时间周期或所述时序队列的长度达到预定值或所述线程的缓存数据量达到预定值。
结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述重做队列处理单元,进一步的用于:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前,获取所述重做队列的队列锁,以获得对所述重做队列的写入权限;以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后释放所述重做队列的队列锁。
结合第一方面或第一方面的第一种可能的实现方式或第一方面的第二种可能的实现方式,在第三种可能的实现方式中,该方法还包括,所述重做队列处理单元,进一步的用于:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前获取所述时序队列的队列锁以锁定所述时序队列,以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后释放所述时序队列的队列锁;或者所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前给所述时序队列的队尾元素添加读取结束标识。
结合第一方面以及第一方面的第一至第三种可能的实现方式中的任意一个,在第四种可能的实现方式中,该方法还包括:所述重做队列处理单元,在从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后进一步的还用于将所述应用线程的标识从所述时序队列中删除。
由以上技术方案可以看出,由于本发明实施例利用应用线程生成重做数据后保存到为应用线程分配的缓存,并将应用线程的标识保存到时序队列,满足数据读取条件后才从所述时序队列中读取所述应用线程的标识的顺序依次将应用线程的缓存中的重做数据读取到重做队列,从而提高了重做数据的处理效率,提升了数据库系统的并发吞吐量。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明一个实施例提供了处理数据库重做数据的方法,应用于服务器中,所述服务器中运行有数据读取线程以及多个应用线程,所述多个应用线程以并发的方式修改数据库,请参照图1,该方法包括:
步骤101:所述多个应用线程中每一应用线程根据修改数据库的操作生成重做数据,并将所述重做数据相应保存到为所述每一应用线程分配的缓存中,获取时序队列锁后将所述应用线程的标识保存到时序队列,所述保存结束后释放所述时序队列锁。
步骤102:所述数据读取线程确定数据读取条件得到满足,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
其中,数据读取条件具体为到达预定的时间周期,或所述时序队列的长度达到预定值,或所述应用线程的缓存数据量达到预定值。
可选的,所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前,进一步包括获取所述重做队列的队列锁,以获得对所述重做队列的写入权限;所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后,进一步包括释放所述重做队列的队列锁。
可选的,所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前还包括获取所述时序队列的队列锁以锁定所述时序队列,以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后还包括释放所述时序队列的队列锁;或者所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前还包括给所述时序队列的队尾元素添加读取结束标识。
可选的,从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后还包括将所述应用线程的标识从所述时序队列中删除。
本发明另一个实施例提供了处理数据库重做数据的信令流程图,请参照图2,具体流程包括:
步骤201:服务器接收到终端访问数据库的指令后,启动多个应用线程并发修改数据库,并为每个应用线程分配各自的缓存,并启动数据读取线程。
具体的,本实施例中,有三个并发修改数据库的应用线程,其线程标识分别为SessionID1、SessionID2和SessionID3。
步骤202:任一应用线程根据修改数据库的操作生成重做数据后,将所述重做数据保存到为该应用线程分配的缓存,获取时序队列锁后将所述应用线程的标识保存到时序队列,保存结束后释放该时序队列锁。
具体的,本实施例中,步骤202中三个应用线程的操作子步骤如下:
步骤202-1:应用线程1对数据库进行修改,根据该修改操作生成重做数据Redo1,将Redo1保存到应用线程1的缓存中。
步骤202-2:应用线程1锁定时序队列、即获取时序队列锁,因此获取到对所述时序队列的写入权限,将应用线程1的标识SessionID1保存到时序队列中,保存后时序队列只包含一个应用线程标识SessionID1,并对时序队列解锁,即释放时序队列锁;因为通过锁定时序队列而获取到所述时序队列的写入权限后,其他应用线程无法同时执行写时序队列的操作,从而保证了在时序队列中保存的应用线程标识的时序性,因为加锁后只要执行一个整形数据的写入操作,所以对时序队列的锁定时间非常短,多个线程的并发性高。
步骤202-3:应用线程2对数据库进行修改,根据该修改操作生成重做数据Redo2,将Redo2保存到应用线程2的缓存中。
步骤202-4:应用线程2锁定时序队列后,将应用线程2的标识SessionID2保存到时序队列中,保存后时序队列包含的应用线程标识为SessionID1和SessionID2,并对时序队列解释,因为队列具有先进先出的特点,所以在时序队列中包含的线程标识根据保存先后顺序存放。
步骤202-5:应用线程3对数据库进行修改,根据该修改操作生成重做数据Redo3,将Redo3保存到应用线程3的缓存中。
步骤202-6:应用线程3锁定时序队列后,将线程3的标识SessionID3保存到时序队列中,保存后时序队列包含的应用线程标识为SessionID1、SessionID2和SessionID3,并对时序队列解锁。
步骤202-7:应用线程2对数据库再次进行修改,根据该修改操作生成重做数据Redo4,将Redo4保存到应用线程2的缓存中,因为缓存采用队列的数据结构,具有先进先出的特点,重做数据Redo2和Redo4按生成先后顺序在缓存中存放。
步骤202-8:应用线程2锁定时序队列后,将应用线程2的标识SessionID2保存到时序队列中,保存后时序队列包含的应用线程标识为SessionID1、SessionID2、SessionID3和SessionID2,并对时序队列解锁。
步骤203:数据读取线程确定满足数据读取条件后,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
其中,数据读取条件可以是到达预定的时间周期、或者时序队列的长度达到预定值、或者应用线程的缓存数据量达到预定值。可选的,服务器可以同时设置多个不同类型的数据读取条件,当任意一个条件满足时,都需要进行数据读取操作。例如,可以同时设置第一数据读取条件为时间周期为10s,第二数据读取条件为应用线程的缓存数据量达到10个,通过设置时间周期避免数据库操作不频繁时重做数据在缓存中保留时间过长,通过设置应用线程的缓存阈值避免数据库操作频繁时缓存中的数据得不到及时处理。具体的,在本实施例中,将数据读取条件设置为时序队列的长度达到4。
其中,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列,该步骤具体实现方法的可以是:遍历时序队列,将每个遍历得到的应用线程的标识对应的应用线程的缓存中一个重做数据读取到重做队列。
其中,因为在依次从时序队列中应用线程的标识对应的应用线程的缓存读取重做数据的过程中可能有新的应用线程的标识保存到时序队列,为了减少对本次依次读取重做数据操作的干扰、提高数据读取的效率,可以在本次依次读取重做数据操作之前,锁定时序队列、即获得时序队列锁,从而获取时序队列的写入权限,以禁止有新的应用线程的标识保存到时序队列中,直到本次读取重做数据操作结束之后释放时序队列锁,应用程序将等待、直到获取时序队列锁后才能将新的应用线程的标识保存到时序队列,或者在本次依次读取重做数据操作之前给时序队列的队尾元素添加读取结束标识,此时允许保存新的应用线程的标识,但检测到该读取结束标识时停止本次读取重做数据的操作。
可选的,因为允许同时设置多个不同类型的数据读取条件,在确定满足第一数据读取条件后依次读取重做数据写入重做队列的过程中可能检测到满足第二数据读取条件,为了避免第二数据读取条件引起新的数据读取并写入重做队列操作,在确定满足第一数据读取条件后,执行依次读取重做数据写入重做队列操作之前,锁定重做队列以获取重做队列的写入权限,从而避免了同时有新的写重做队列操作。只有当第一次执行的依次读取重做数据写入重做队列操作结束并释放重做队列锁之后,数据读取线程才能根据第二数据读取条件为新的重做数据读取操作分配重做队列锁,从而执行新的重做数据读取并写入重做队列操作。
其中,从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后,还包括将所述时序队列中应用线程的标识从所述时序队列中删除。
具体的,本实施例中,步骤203中数据读取线程的详细操作过程如下:
数据读取线程确定时序队列的长度为4后,在时序队列的队尾元素,即第四个元素添加读取结束标识后遍历该时序队列,因此在重做数据读取过程中三个应用线程还可以继续执行数据库修改操作,即将重做数据添加到缓存中,以及将应用线程的标识添加到时序队列中。其中,通过为队列中每个元素添加一个StopFlag属性,且单独将队尾元素的StopFlag属性值设置为1的方式来添加读取结束标识。
数据读取线程遍历得到第一个应用线程的标识为SessionID1后,将SessionID1对应的应用线程1的缓存中一个重做数据读取到重做队列中,因为缓存是先进先出的结构,所以读取到的是第一个数据即Redo1,读取过后第二个数据将成为第一个数据;并将SessionID1从时序队列中删除,此时重做队列中包含的数据为Redo1。
数据读取线程遍历得到第二个应用线程的标识为SessionID2后,将SessionID2对应的应用线程2的缓存中一个重做数据、即Redo2读取到重做队列中,读取过后Redo4将成为应用线程2的缓存中第一个重做数据;并将SessionID2从时序队列中删除,此时重做队列中包含的数据为Redo1,Redo2。
数据读取线程遍历得到第三个应用线程的标识为SessionID3后,将SessionID3对应的应用线程3的缓存中一个重做数据、即Redo3读取到重做队列中,并将SessionID3从时序队列中删除,此时重做队列中包含的数据为Redo1,Redo2,Redo3。
数据读取线程遍历得到第四个应用线程的标识为SessionID2后,将SessionID2对应的应用线程2的缓存中一个重做数据、即Redo4读取到重做队列中,并将SessionID2从时序队列中删除,此时重做队列中包含的数据为Redo1,Redo2,Redo3,Redo4。因为遍历到第四个元素时,检测到读取结束标识,停止本次重做数据读取操作。
步骤204:将所述重做队列中的重做数据写入到磁盘中。
具体的,可以是数据读取线程执行完本次读取重做数据的操作后立即将重做队列中的重做数据一次性全部写入到磁盘中。
本发明一个实施例提供了处理数据库重做数据的服务器,服务器中运行有多个应用线程,所述多个应用线程以并发的方式修改数据库,请参照图3,该服务器300包括:
时序队列处理单元301,用于在所述多个应用线程中每一应用线程根据修改数据库的操作生成重做数据,并将所述重做数据相应保存到为所述每一应用线程分配的缓存中,获取时序队列锁后将所述应用线程的标识保存到时序队列,所述保存结束后释放所述时序队列锁以及将所述时序队列发送到重做队列处理单元302;
重做队列处理单元302,用于从时序队列处理单元301接收所述时序队列,以及确定数据读取条件得到满足后,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
可选的,重做队列处理单元302确定满足数据读取条件具体包括确定到达预定的时间周期或所述时序队列的长度达到预定值或所述线程的缓存数据量达到预定值。
可选的,重做队列处理单元302,进一步的用于:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前,获取所述重做队列的队列锁,以获得对所述重做队列的写入权限;以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后释放所述重做队列的队列锁。
可选的,重做队列处理单元302,进一步的用于:所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前获取所述时序队列的队列锁以锁定所述时序队列,以及所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后释放所述时序队列的队列锁;或者所述依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之前给所述时序队列的队尾元素添加读取结束标识。
可选的,重做队列处理单元302,在从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列之后进一步的还用于将所述应用线程的标识从所述时序队列中删除。
本发明实施例中的服务器可以基于计算机系统来实现,图1、图2所示的方法均可在基于计算机系统的服务器来实现。图4示出了基于计算机系统来实现的服务器的实施例。本实施例中服务器可以包括:处理器401、存储器402和通信接口403,其中:
通信接口403,用于与终端通信。服务器与终端之间交互的消息均通过通信接口403发送和接收。具体地,通信接口403用于从终端接收访问数据库的指令;存储器402用于存储程序指令;处理器401用于从终端接收访问数据库的指令之后,调用存储器402中存储的程序指令,执行如下操作:启动数据读取线程以及多个应用线程,所述多个应用线程以并发的方式修改数据库,所述多个应用线程中每一应用线程根据修改数据库的操作生成重做数据,并将所述重做数据相应保存到为所述每一应用线程分配的缓存中,获取时序队列锁后将所述应用线程的标识保存到时序队列,所述保存结束后释放所述时序队列锁;所述数据读取线程确定数据读取条件得到满足,从所述时序队列中读取所述应用线程的标识的顺序,依次从所述时序队列中应用线程的标识对应的应用线程的缓存中读取一个重做数据写入重做队列。
其中,处理器401可以是中央处理器(central processing unit,CPU)、专用集成电路(application-specific integrated circuit,ASIC)等。其中,本实施例中的服务器可以包括总线404。处理器401、存储器402以及通信接口403之间可通过总线404连接并通信。其中,存储器402可以包括:随机存取存储器(random access memory,RAM),只读存储器(read-onlymemory,ROM),磁盘等具有存储功能的实体。
处理器401还可以用于执行方法实施例中图1、图2描述的服务器的各步骤,本发明实施例在此不再详述。
以上对本发明所提供的一种进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。