具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本实施例提供的基于时间戳的任务防重方法,可应用在如图1的应用环境中,其中,终端设备通过网络与服务端进行通信。其中,终端设备包括不限于各种个人计算机、笔记本电脑、智能手机、平板电脑和便携式可穿戴设备。服务端可以用独立的服务器或者是多个服务器组成的服务器集群来实现。
在一实施例中,如图2所示,提供一种基于时间戳的任务防重方法,以该方法应用在图1中的服务端为例进行说明,包括如下步骤:
S10、接收对数据库中用于存储数据的指定表的更新请求,所述更新请求中包含待更新参数。
本实施例中,指定表指的是数据库中的用于存储数据的表。数据库是一种存储数据的仓库,其本质是一个文件系统,其存储的数据按照特定的格式存储。数据库中以表为组织单位存储数据。数据库中包括了多个表。数据库存储于服务端。更新请求包含待更新参数,可以根据待更新参数对指定表中的数据进行更新。对指定表中的数据进行更新涉及的操作包括但不限增加数据,修改数据,删除数据及查询数据操作。在此处,更新请求可以来自本地的终端设备,也可以来自远程终端的终端设备。
S20、获取所述数据库中所述指定表的时间戳;并获取当前系统时间,根据所述当前系统时间计算当前系统的时间戳。
本实施例中,时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。格林威治时间1970年01月01日00时00分00秒相当于北京时间1970年01月01日08时00分00秒。可理解地,所述指定表设置有时间戳,该时间戳为上一次所述指定表中的内容发生更新时,与发生更新的时间所对应的时间戳。例如,指定表最近一次发生更新的时间为北京时间2018年08月20号09时00分00秒,则指定表的时间戳为1534726800。当前系统的时间戳指的是根据当前系统时间计算出来的时间戳。在以北京时间为时区或者时区与北京时间相同的区域,当前系统的时间戳可以表示为:(SYSDATE-TO_DATE('1970-1-1 8','YYYY-MM-DD HH24'))*86400。具体为,当前系统时间为2018年08月20日10时00分00秒,则当前的时间戳为1534730400。
S30、计算所述当前系统的时间戳与所述指定表的时间戳的差值,并检测所述差值是否大于预设阈值。
本实施例中,可以创建一数据库锁,表名设置为TAB_LOCK,用于记录指定表的时间戳。可以参照如表1所示的结构设计,对数据库锁进行设置。
表1数据库锁的结构设计
字段 |
类型 |
约束 |
说明 |
lock_name |
varchar(100) |
唯一索引 |
锁名 |
ts_version |
number(18) |
|
以时间戳表示的版本号 |
表1中,数据库锁至少包括两个字段。第一字段用于记录锁名,如表中的lock_name”。用户也可以根据自己的需要自定义锁名。第一字段的类型为“varchar(100)”,表示第一字段可以存储长度100字符以内的字符串。第一字段为唯一索引,在表中可以区分不同的锁,每个锁有唯一的名称。第二字段用于记录以时间戳表示的版本号,如表中的“ts_version”。第二字段的类型为number(18),表示第二字段可以存储最大长度为18位的数字。第二字段不是主键值,因而没有唯一索引约束。在指定表发生更新操作时,可生成指定表的时间戳。计算当前系统的时间戳与指定表的时间戳的差值,具体的操作为两个时间戳相减,获得差值。例如,当前系统的时间戳为1534730400,指定表的时间戳为1534730300,则计算当前系统的时间戳与指定表的时间戳的差值为100。
预设阈值可以是一个固定的值,如由系统管理员按照表的类型进行设置,可以设置为30、60或者其他数值。可通过计算当前系统的时间戳与第二字段的时间戳的差值,然后将差值与预设阈值进行比较,来实现数据库锁的功能。
S40、在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新,并将所述指定表的时间戳的值设置为所述当前系统的时间戳。
在当前系统的时间戳与指定表的时间戳的差值大于预设阈值时,则按照更新请求对指定表进行更新。具体为,指定表还包括其他多个字段的数据,此时,可根据更新请求中包含的数据对指定表中的数据进行更新。
在执行更新操作的同时,对指定表的时间戳的值进行更新,并将指定表的时间戳的值设置为所述当前系统的时间戳的值。例如,在一指定表中,t.ts_version为指定表的时间戳,预设阈值设置为60。在当前系统的时间戳与指定表的时间戳的差值大于60时,将当前系统的时间戳赋予给指定表的时间戳。例如,t.ts_version=1534732300,当前系统时间为北京时间2018年8月20日14点00分00秒,经计算可获得当前系统的时间戳为1534744800,则当前系统的时间戳与指定表的时间戳的差值为:1534744800-1534732300=125000,该差值大于预设阈值60,即125000>60,然后更新指定表的时间戳,即t.ts_version=1534744800。
步骤S10-S40中,接收对数据库中用于存储数据的指定表的更新请求,所述更新请求中包含待更新参数,数据库接收到对指定表的更新任务。获取所述数据库中所述指定表的时间戳;并获取当前系统时间,根据所述当前系统时间计算当前系统的时间戳,计算十分简便,计算占用的系统资源非常少,计算速度快。计算所述当前系统的时间戳与所述指定表的时间戳的差值,并检测所述差值是否大于预设阈值,以确定在预设阈值的时间内是否存在重复针对指定表的任务执行。在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新,并将所述指定表的时间戳的值设置为所述当前系统的时间戳,以便于在同一预设阈值的时间内没有在先的任务时,则对指定表进行更新,同时限制了其他更新任务在预设阈值的时间内不能对指定表进行更新,保证了在预设阈值的时间内指定表只执行一次更新操作。本实施例提供的基于时间戳的任务防重方法,具有数据库乐观锁特性,数据处理效率非常高;同时基于秒级时间戳的锁方式,可以保证在预设阈值的时间内,任务不会被重复执行;该方法可在SQL层运行,不依赖于具体任务,实现简单。
可选的,如图3所示,步骤S30之后,还包括:
S41、在所述差值小于或等于预设阈值时,结束所述更新请求。
本实施例中,在当前系统的时间戳与指定表的时间戳的差值小于或等于预设阈值时,说明此时在预设阈值范围内,已经存在另一个更新请求,数据库将结束当前的更新请求,防止任务重复执行。例如,有两个定时的更新请求,分别为第一更新请求和第二更新请求,两个更新请求的发送时间完全一样,同样设置为12:00。T1时刻,数据库同时接收到两个更新请求。T2时刻,第一更新请求所占用的第一线程计算第一线程的时间戳与指定表的时间戳的差值,由于第一线程的时间戳与指定表的时间戳的差值大于预设阈值,所以服务器根据第一更新请求进行更新操作,同时将指定表的时间戳更新为第一线程的时间戳。T3时刻,第二更新请求所占用的第二线程计算第一线程的时间戳与指定表的时间戳的差值,由于第二线程的时间戳与指定表的时间戳(即第一线程的时间戳)的差值为0,小于预设阈值,所以服务器拒绝第二更新请求,不进行更新操作,同时指定表的时间戳没有发生变化,依然为第一线程的时间戳。在实际的运行过程中,可以是第一线程先对指定表的时间戳进行更新,也可以是第二线程先对指定表的时间戳进行更新。换句话说就是,随机执行第一线程或第二线程,然后结束未执行的另一线程。
在时间长度为预设阈值的时间内,指定表的时间戳只能进行一个更新操作,若同时出现另一更新操作,则同时出现的另一更新操作将被结束,这样可以防止出现更新操作重复执行的问题。
可选的,如图4所示,步骤S30之前,还包括:
S301、获取当前的系统资源消耗情况;
S302、根据所述系统资源消耗情况计算执行所述更新请求对应的更新操作的第一预估执行时间,所述系统资源消耗与所述第一预估执行时间成正比;
S303、根据所述第一预估执行时间确定所述预设阈值,所述预设阈值大于所述第一预估执行时间。
本实施例中,还可以根据数据库的系统资源消耗情况来确定对指定表更新的预设阈值。系统资源消耗情况指的是数据库所在服务器的系统运行情况,可以是CPU使用率、磁盘I/O参数、内存I/O参数、网络I/O参数等。第一预估执行时间是预计执行所述更新请求对应的更新操作的时长。预设阈值大于第一预估执行时间。例如,数据库在有大量数据读写时,指定表的更新速度较慢,第一预估执行时间较长,为了保证指定表有足够的时间进行更新操作,预设阈值可以设置为一个较大的数,如70,也就是说70秒内,该表仅允许一次更新操作;数据库没有大量数据读写时,指定表的更新速度较快,第一预估执行时间较短,为了减少指定表的更新等待时间,预设阈值可以设置为一个较小的数,如30,也就是说在一次更新操作的30秒之后,可以再次执行更新操作。
步骤S301-S303中,获取当前的系统资源消耗情况,以获知当前数据库所在的服务端的数据处理能力,保证对指定表的更新操作与服务端的数据处理能力匹配,防止出错。根据所述系统资源消耗情况计算执行所述更新请求对应的更新操作的第一预估执行时间,所述系统资源消耗与所述第一预估执行时间成正比,系统资源消耗情况可以反映当前服务端的系统资源分配,系统资源消耗越小,指定表的更新操作越快,第一预估执行时间可以设置小一些,系统资源消耗越大,指定表的更新操作越慢,第一预估执行时间可以设置大一些。根据所述第一预估执行时间确定所述预设阈值,所述预设阈值大于所述第一预估执行时间,预设阈值可以自动调节,在系统资源消耗较小的时候,缩短预设阈值,提高指定表的可更新频率,在系统资源消耗较大的时候,增加预设阈值,减少指定表更新的出错率。
可选的,如图5所示,步骤S30之前,还包括:
S304、获取所述更新请求对应的用户标识;
S305、根据所述用户标识计算执行所述更新请求对应的更新操作的第二预估执行时间,不同用户标识的所述更新请求对应的更新操作涉及的字段数量不同;
S306、根据所述第二预估执行时间确定所述预设阈值,所述预设阈值大于所述第二预估执行时间。
本实施例中,还可以根据发送更新请求的用户标识来确定对指定表更新的预设阈值。例如,有一些用户,其所要执行的更新操作仅针对少数字段的修改,指定表的更新速度较快,第二预估执行时间较短,为了减少指定表的更新等待时间,预设阈值可以设置为一个较小的数,如20,也就是说在一次更新操作的20秒之后,可以再次执行更新操作。而另一些用户,其所要执行的更新操作是针对大量字段的修改,指定表的更新速度较慢,第二预估执行时间较长,为了保证指定表有足够的时间进行更新操作,预设阈值可以设置为一个较大的数,如80,也就是说80秒内,该表仅允许一次更新操作。
步骤S304-S306中,获取所述更新请求对应的用户标识,服务端可以根据用户标识预测更新操作的工作量,以匹配不同用户的更新需求。根据所述用户标识计算执行所述更新请求对应的更新操作的第二预估执行时间,不同用户标识的所述更新请求对应的更新操作涉及的字段数量不同,不同用户标识所对应的用户有不同的操作习惯,可以根据用户操作习惯的特点计算第二预估执行时间。根据所述第二预估执行时间确定所述预设阈值,所述预设阈值大于所述第二预估执行时间,预设阈值可以根据用户标识自动调节,在第二预估执行时间较小的时候,缩短预设阈值,提高指定表的可更新频率,在第二预估执行时间较大的时候,增加预设阈值,减少指定表更新的出错率。
可选的,如图6所示,所述在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新之前,还包括:
S307、计算所述更新请求的字节数;
S308、根据所述字节数计算执行所述更新请求对应的更新操作的第三预估执行时间,所述更新请求的字节数与所述第三预估执行时间成正比;
S309、根据所述第三预估执行时间确定所述预设阈值,所述预设阈值大于所述第三预估执行时间。
本实施例中,还可以根据发送更新请求的字节数来确定对指定表更新的预设阈值。例如,更新请求的字节数较少,其所要执行的更新操作仅针对少数字段的修改,指定表的更新速度较快,第三预估执行时间较短,为了减少指定表的更新等待时间,预设阈值可以设置为一个较小的数,如25,也就是说在一次更新操作的25秒之后,可以再次执行更新操作。更新请求的字节数较多,其所要执行的更新操作是针对较多字段的修改,指定表的更新速度较慢,第三预估执行时间较长,为了保证指定表有足够的时间进行更新操作,预设阈值可以设置为一个较大的数,如65,也就是说65秒内,该指定表仅允许一次更新操作。
步骤S307-S309中,计算所述更新请求的字节数,根据更新请求的字节数确定更新操作的任务量,计算简便。根据所述字节数计算执行所述更新请求对应的更新操作的第三预估执行时间,所述更新请求的字节数与所述第三预估执行时间成正比,利用字节数与执行时间的对应关系计算第三预估执行时间,计算速度快。根据所述第三预估执行时间确定所述预设阈值,所述预设阈值大于所述第三预估执行时间,预设阈值可以自动调节,在第三预估执行时间较小的时候,缩短预设阈值,提高指定表的可更新频率,在第三预估执行时间较大的时候,增加预设阈值,减少指定表更新的出错率。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
在一实施例中,提供一种基于时间戳的任务防重装置,该基于时间戳的任务防重装置与上述实施例中基于时间戳的任务防重方法一一对应。如图7所示,该基于时间戳的任务防重装置包括接收请求模块10、获取时间戳模块20、检测模块30和更新模块40。各功能模块详细说明如下:
接收请求模块10,用于接收对数据库中用于存储数据的指定表的更新请求,所述更新请求中包含待更新参数;
获取时间戳模块20,用于获取所述数据库中所述指定表的时间戳;并获取当前系统时间,根据所述当前系统时间计算当前系统的时间戳;
检测模块30,用于计算所述当前系统的时间戳与所述指定表的时间戳的差值,并检测所述差值是否大于预设阈值;
更新模块40,用于在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新,并将所述指定表的时间戳的值设置为所述当前系统的时间戳。
本实施例提供的基于时间戳的任务防重装置,具有数据库乐观锁特性,数据处理效率非常高;同时基于秒级时间戳的锁方式,可以保证在预设阈值的时间内,任务不会被重复执行;该方法可在SQL层运行,不依赖于具体任务,实现简单。
可选的,基于时间戳的任务防重装置还包括:
结束模块,用于在所述差值小于或等于预设阈值时,结束所述更新请求。
可选的,基于时间戳的任务防重装置还包括:
获取资源消耗模块,用于获取当前的系统资源消耗情况;
第一时间模块,用于根据所述系统资源消耗情况计算执行所述更新请求对应的更新操作的第一预估执行时间,所述系统资源消耗与所述第一预估执行时间成正比;
第一确定阈值模块,用于根据所述第一预估执行时间确定所述预设阈值,所述预设阈值大于所述第一预估执行时间。
可选的,基于时间戳的任务防重装置还包括:
标识获取模块,用于获取所述更新请求对应的用户标识;
第二时间模块,用于根据所述用户标识计算执行所述更新请求对应的更新操作的第二预估执行时间,不同用户标识的所述更新请求对应的更新操作涉及的字段数量不同;
第二确定阈值模块,用于根据所述第二预估执行时间确定所述预设阈值。
可选的,基于时间戳的任务防重装置还包括:
计算字节数模块,用于计算所述更新请求的字节数;
第三时间模块,用于根据所述字节数计算执行所述更新请求对应的更新操作的第三预估执行时间,所述更新请求的字节数与所述第三预估执行时间成正比;
第三确定阈值模块,用于根据所述第三预估执行时间确定所述预设阈值,所述预设阈值大于所述第三预估执行时间。
关于基于时间戳的任务防重装置的具体限定可以参见上文中对于基于时间戳的任务防重方法的限定,在此不再赘述。上述基于时间戳的任务防重装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图8所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储基于时间戳的任务防重方法涉及到的数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于时间戳的任务防重方法。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
接收对数据库中用于存储数据的指定表的更新请求,所述更新请求中包含待更新参数;
获取所述数据库中所述指定表的时间戳;并获取当前系统时间,根据所述当前系统时间计算当前系统的时间戳;
计算所述当前系统的时间戳与所述指定表的时间戳的差值,并检测所述差值是否大于预设阈值;
在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新,并将所述指定表的时间戳的值设置为所述当前系统的时间戳。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
接收对数据库中用于存储数据的指定表的更新请求,所述更新请求中包含待更新参数;
获取所述数据库中所述指定表的时间戳;并获取当前系统时间,根据所述当前系统时间计算当前系统的时间戳;
计算所述当前系统的时间戳与所述指定表的时间戳的差值,并检测所述差值是否大于预设阈值;
在所述差值大于预设阈值时,按照所述待更新参数对所述指定表进行更新,并将所述指定表的时间戳的值设置为所述当前系统的时间戳。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。