CN109753544A - 数据库序列处理方法、系统及基于同步锁的节点服务器 - Google Patents
数据库序列处理方法、系统及基于同步锁的节点服务器 Download PDFInfo
- Publication number
- CN109753544A CN109753544A CN201910007420.5A CN201910007420A CN109753544A CN 109753544 A CN109753544 A CN 109753544A CN 201910007420 A CN201910007420 A CN 201910007420A CN 109753544 A CN109753544 A CN 109753544A
- Authority
- CN
- China
- Prior art keywords
- sequence
- warehouse
- current
- series
- database
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据库序列处理方法、系统及基于同步锁的节点服务器,该数据库序列处理方法包括将当前步长序列的使用次数初始化为零,在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量,在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。本发明在节点服务器的序列仓库中缓存的步长序列的数量大于零时,从序列仓库中获取新的步长序列作为当前步长序列,完全为节点服务器内存操作,避免了和数据库序列的交互,可以降低数据库序列的资源成本,提高数据库序列的处理性能。
Description
技术领域
本发明涉及计算机数据处理技术领域,尤其涉及数据库序列处理方法、系统及基于同步锁的节点服务器。
背景技术
本部分旨在为权利要求书中陈述的本发明实施例提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
一些数据库将自动增长的字段单独提取成一个数据库方案对象,该种数据库称为数据库序列,数据库序列中的自动增长的字段称为序列。这种序列可以按照指定的模式自动产生顺序编号的整数。
序列在实际应用中具有非常重要的作用。例如一些人事信息系统可以通过序列来生成员工编号,企业信息管理系统可以通过序列生成物料编号,订单交易系统可以通过序列生成交易订单编号,交易系统可以通过序列生成交易流水号等等。
高并发处理系统(例如订单系统或交易系统等)广泛应用数据库序列。高并发处理系统,一般采用集群或者分布式部署方式,而类似于订单系统生成唯一订单、交易系统生成全局唯一的交易流水号这种场景,完全由节点服务器来实现成本会比较高。因为完全由节点服务器节点实现,就意味着每个节点服务器应用的部署环境配置或程序版本都不一致,维护成本、扩展成本等就会很高。采用数据库序列的方式实现这种业务场景是比较常用的方式。高并发处理系统如果使用数据库序列来保证订单号、交易流水号的全局唯一,不可避免的需要占用大量的数据库连接资源,高频的数据库交互访问,势必会造成数据库序列较高的资源成本;同时很大程度上增加数据库序列的处理时间,影响数据库序列处理性能。
因此,现有的数据库序列存在资源成本高、处理性能较低的问题。
发明内容
本发明实施例提供一种数据库序列处理方法,应用于基于同步锁的节点服务器中,用以降低数据库序列的资源成本,提高数据库序列的处理性能,该方法包括:
将当前步长序列的使用次数初始化为零;
在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。
本发明实施例还提供一种基于同步锁的节点服务器,用以降低数据库序列的资源成本,提高数据库序列的处理性能,该基于同步锁的节点服务器包括:
初始化模块,用于将当前步长序列的使用次数初始化为零;
数量获取模块,用于在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
步长序列获取模块,用于在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。
本发明实施例还提供一种数据库序列处理系统,包括多个上述实施例所述的基于同步锁的节点服务器,多个节点服务器采用集群或者分布式部署方式。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述数据库序列处理方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述数据库序列处理方法的计算机程序。
本发明实施例中,数据库序列处理方法,应用于基于同步锁的节点服务器中,包括将当前步长序列的使用次数初始化为零,在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列,在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。在本发明实施例中,在当前步长序列的使用次数等于序列步长、且节点服务器的序列仓库中缓存的步长序列的数量大于零时,从节点服务器的序列仓库中获取新的步长序列作为当前步长序列,完全为节点服务器内存操作,其避免了和数据库序列的交互,可以降低数据库序列的资源成本,提高数据库序列的处理性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本发明第一实施例提供的数据库序列的处理方法的实现流程图;
图2为本发明第二实施例提供的数据库序列的处理方法的实现流程图;
图3为本发明第三实施例提供的数据库序列的处理方法的实现流程图;
图4为本发明第四实施例提供的数据库序列的处理方法的实现流程图;
图5为本发明第五实施例提供的数据库序列的处理方法的实现流程图;
图6为本发明第六实施例提供的基于同步锁的节点服务器的功能模块图;
图7为本发明第七实施例提供的基于同步锁的节点服务器的功能模块图;
图8为本发明第八实施例提供的基于同步锁的节点服务器的功能模块图;
图9为本发明第九实施例提供的基于同步锁的节点服务器的功能模块图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
虽然本发明提供了如下述实施例或附图所示的方法操作步骤或装置结构,但基于常规或者无需创造性的劳动在所述方法或装置中可以包括更多或者更少的操作步骤或模块单元。在逻辑性上不存在必要因果关系的步骤或结构中,这些步骤的执行顺序或装置的模块结构不限于本发明实施例或附图所示的执行顺序或模块结构。所述的方法或模块结构的在实际中的装置或终端产品应用时,可以按照实施例或者附图所示的方法或模块结构进行顺序执行或者并行执行。
针对现有技术中数据库序列存在的资源成本高、处理性能较低的缺陷,本发明的发明人提出了一种数据库序列处理方法、系统及基于同步锁的节点服务器,通过在节点服务器的序列仓库中缓存步长序列,在序列仓库中的步长序列的数量大于零时,从节点服务器的序列仓库中获取新的步长序列作为当前步长序列,避免了和数据库序列的交互,达到了降低数据库序列的资源成本,提高数据库序列的处理性能的目的。
图1示出了本发明第一实施例提供的数据库序列处理方法的实现流程,为便于描述,仅示出了与本发明实施例相关的部分,详述如下:
如图1所示,数据库序列处理方法,应用于基于同步锁的节点服务器中,数据库序列处理方法包括:
步骤101,将当前步长序列的使用次数初始化为零;
步骤102,在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
步骤103,在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。
一些数据库将自动增长的字段单独提取成一个数据库方案对象,该种数据库称为数据库序列,数据库序列中的自动增长的字段称为序列。这种序列可以按照指定的模式自动产生顺序编号的整数。支持独立序列的数据库包括ORACLE、DB2等主流数据库。
数据库序列主要由以下几部分组成:数据库序列最大值,数据库序列最小值,步长、起始值、同步锁及处理性能等。其中,数据库序列最大值是指数据库序列可使用的最大数值,数据库序列最小值是指数据库序列可使用的最大数值。起始值,是指定义序列时的起始数值,起始数值需要介于数据库序列最大值和数据库序列最小值之间。步长是指序列的步进值,传统的数据库序列中序列的步长一般情况下默认步进值为1。
发明人发现,鉴于传统的序列的步长一般默认为1,即便是传统的数据库序列利用缓冲对少量序列值进行缓存,也需要根据处理量合理设置序列缓冲的大小,通过优化数据库序列的序列缓冲,这在一定程度上可以提高数据库序列的处理性能,但提成的效果有限,并且仍然需要与数据库序列进行频繁的交互,并不能减少与数据库序列的交互成本,同样影响了数据库序列的处理性能。
因此,发明人创造性的提出把序列的步长大于1的序列称为步长序列。此时的步长序列是可以使用步长序列中的多个序列值范围的序列。假设步长序列的步长预先设置为1000,获取的当前步长序列的起始值为1001时,那么可以使用的序列值为1001-2000。这样在使用序列时,不是单独的获取一个序列值,而是获取包含多个序列值的步长序列,并自行进行同步递增,显著降低了和数据库序列的交互次数,大大提高了数据库序列的处理性能。
同步锁是指在多个线程使用同一资源时,如果对该资源加上同步锁,可以保证当前时刻只有一个线程可以使用该资源,其他线程需要等待资源释放后才可以使用。在本发明实施例中,对于步长序列的使用,多线程同时申请获取步长序列时,为保证产生序列号的唯一性,需要利用同步锁机制对申请获取步长序列进行同步锁处理。
数据库序列的处理性能,可以采用每秒钟事务处理量(英文全称:TransactionPer Second,简称TPS)表示。每秒钟事务处理量是一个表达系统处理能力的重要的性能指标,是指每秒钟系统能够处理的交易或者事务的数量。在本发明实施例中,其是指数据库序列每秒钟使用的序列值的数量。
本发明的发明人通过对传统的数据库序列的研究发现,传统的数据库序列在获取序列时,需要频繁的与数据库序列进行交互,高频的数据库序列交互访问,造成数据库序列非常高的资源成本,严重影响数据库序列的处理性能。
为此,发明人又创造性的提出序列仓库的概念,并在序列仓库中缓存部分数量的步长序列,缓存的步长序列的数量大小为序列仓库的大小。这样,在获取步长序列时直接从序列仓库中获取步长序列,而这完全是节点服务器内存操作,处理性能非常高,进一步的降低和数据库序列的交互次数,提高数据库序列的处理性能。
在实施本发明之前,首先需要创建一个数据库序列,并对数据库序列的相关参数进行配置。例如配置数据库序列最大值、数据库序列最小值、步长序列的步长(步进值)、序列仓库大小,即序列仓库中缓存的步长序列的数量等。在节点服务器每次服务启动时,获取数据库序列最大值、数据库序列最小值、步长序列的步长及序列仓库大小等参数。
假设数据库序列的处理性能要求为10000TPS,并由10个节点服务器承担。那么每个节点服务器的处理性能则为1000TPS,即每个节点服务器每秒钟要使用1000个序列值。假设我们预先设置的步长序列的步长为500(步长序列的步长不宜太长,否则系统维护会造成大量的序列浪费),序列仓库中步长序列的数量可以为12-15个等。本领域技术人员可以理解的是,本发明实施例中的举例仅仅是一种示例性的说明,并不构成对本发明的一种限制。
在节点服务器每次服务启动时,首先从数据库序列中获取当前步长序列的起始序列值,并将当前步长序列的使用次数初始化为零。之后在每次接收到序列请求时,将当前步长序列的使用次数加一,在当前步长序列的使用次数不大于序列步长时如此往复。步长序列是包含一个范围内很多个序列值的序列,步长序列所包含的序列值的数量和步长序列的使用次数是相一致的,步长序列中包含多少个序列值,即说明步长序列就可以使用多少次。
在每次接收到序列请求时将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长时,说明步长序列所包含的序列值已被使用完毕,此时为了减少和数据库序列的交互次数,从节点服务器的仓库序列中获取新的步长序列。仓库序列用于缓存步长序列。在从节点服务器的仓库序列中获取新的步长序列之前,需要保证节点服务器的仓库序列还存在可以使用的步长序列。因此,还需要获取节点服务器的序列仓库中步长序列的数量,在节点服务器的序列仓库中步长序列的数量大于零时,说明节点服务器的序列仓库中还存在可以使用的步长序列,此时从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。
在从序列仓库中的步长序列中获取新的步长序列作为当前步长序列后,只要节点服务器在未关闭之前,即未重新启动服务之前,不再从数据库序列中获取当前步长序列的起始序列值,此时新的步长序列为当前步长序列,此处直接获取当前步长序列的起始序列值即可,只有在每次节点服务器重新启动服务时,才从数据库序列中获取当前步长序列的起始序列值。
在本发明实施例中,将当前步长序列的使用次数初始化为零,在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列,在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。在本发明实施例中,在节点服务器的序列仓库中缓存的步长序列的数量大于零时,从节点服务器的序列仓库中获取新的步长序列作为当前步长序列,完全为节点服务器内存操作,其避免了和数据库序列的交互,可以降低数据库序列的资源成本,提高数据库序列的处理性能。
在本发明的一实施例中,在从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值。
为了在使用新的步长序列的序列值时,和新的步长序列之前的一个步长序列的最后一个序列值衔接起来,在从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值。
假设新的步长序列之前的一个步长序列的最后一个序列值为30,新的步长序列的起始序列值为31,在获取到新的步长序列时,将新的步长序列的起始序列值31作为当前序列值,即可与新的步长序列之前的一个步长序列的最后一个序列值30衔接起来。
图2示出了本发明第二实施例提供的数据库序列处理方法的实现流程,为便于描述,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,在上述所述方法步骤的基础上,如图2所示,数据库序列处理方法,还包括:
步骤201,基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量;
步骤202,若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量。
异步线程是相对于同步线程而言的,是指多线程的异步处理,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其他线程将处理完成,并回调通知此线程。
在本发明的一实施例中,预设时间间隔为预先设置的时间间隔。例如,可以将预设时间间隔预先设置为5秒,或者4秒或者3秒。本领域技术人员可以理解的是,还可以将预设时间间隔预先设置其他时间间隔,例如7秒,或者8秒或者6秒等,本发明实施例对此并不做特别的限制。
在本发明的一实施例中,预设数量为预先设置的序列仓库中步长序列的数量。例如,可以将预设数量预先设置为14个,或者13个或者15个。本领域技术人员可以理解的是,还可以将预设数量预先设置其他数量,例如19个,或者20个或者18个等,本发明实施例对此并不做特别的限制。
需要注意的是,在设置预设时间间隔或者预设数量时可以结合步长序列的步长、数据库序列欲达到的处理性能等参数,合理设置。
为了保证仓库序列中存在可以使用的步长序列,进一步降低和数据库序列的交互次数,提高数据库序列的使用性能,可以基于异步线程每隔预设时间间隔检测一次序列仓库中可用步长序列的数量,在序列仓库中可用步长序列的数量小于预设数量时,从数据库序列中获取步长序列补充到序列仓库中,以使多数情况下都可以直接从序列仓库中获取新的步长序列,更进一步的减少从数据库序列获取步长序列的交互次数,提高数据库序列的处理性能。我们可以将该异步线程称为仓库库管理员线程。在每次节点服务器重新启动服务的同时,启动该仓库库管理员线程。
在本发明实施例中,基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量,若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量,可以进一步降低与数据库序列的交互次数,提高数据库序列的处理性能。
图3示出了本发明第三实施例提供的数据库序列处理方法的实现流程,为便于描述,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,在上述所述方法步骤的基础上,如图3所示,数据库序列处理方法,还包括:
步骤301,在序列仓库中步长序列的数量等于零时,从数据库序列中获取新的步长序列作为当前步长序列。
在获取节点服务器的序列仓库中步长序列的数量,存在序列仓库中步长序列的数量大于零的情况,也存在序列仓库中步长序列的数量等于零的情况。序列仓库中步长序列的数量等于零,说明序列仓库中已经没有可用的步长序列,而尚未达到基于异步线程补充步长序列到序列仓库的时间,为避免影响序列的使用,此时即需要临时从数据库序列中获取新的步长序列作为当前步长序列。
在本发明实施例中,在序列仓库中步长序列的数量等于零时,从数据库序列中获取新的步长序列作为当前步长序列,可以避免影响序列的使用,进一步提高数据库序列的处理性能。
与上述实施例中“从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值”相类似的,在本发明的一实施例中,在从数据库序列中获取新的步长序列作为当前步长序列,同样将新的步长序列的起始序列值作为当前序列值。本发明实施例的实施,具体可参考上述实施例中“从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值”相关实施例的描述部分,此处不再详细赘述。
图4示出了本发明第四实施例提供的数据库序列处理方法的实现流程,为便于描述,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,在上述所述方法步骤的基础上,如图4所示,数据库序列处理方法,还包括:
步骤401,在当前步长序列的使用次数不大于序列步长时,在每次接收序列请求后,利用当前步长序列的当前序列值生成序列号;
在当前步长序列的使用次数小于序列步长时,在每次接收序列请求后,将当前步长序列的当前序列值加一,直至当前步长序列的使用次数等于序列步长。
如上述实施例所述,在当前步长序列的使用次数不大于序列步长时,在每次接收到序列请求时,将当前步长序列的使用次数加一,如此往复。
在将当前步长序列的使用次数加一的同时,在每次接收到序列请求时,说明需要使用序列值,此时同时利用当前步长序列的当前序列值生成序列号。鉴于在根据当前序列值生成序列号时采用了同步锁机制,因此,可以保证生成的序列号唯一。在利用当前步长序列的当前序列值生成序列号之后,将当前步长序列的当前序列值加一,以更新当前步长序列的当前序列值。直至当前步长序列的使用次数等于步长序列,说明当前步长序列中的序列值已被使用完毕,当前序列值即将超出当前步长序列的范围。此时,当前步长序列的使用次数等于步长序列,当前步长序列的当前序列值不再加一。
图5示出了本发明第五实施例提供的数据库序列处理方法的实现流程,为便于描述,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,在上述所述方法步骤的基础上,如图5所示,数据库序列处理方法,在将当前步长序列的当前序列值加一之后,还包括:
步骤501,获取当前序列值与数据库序列最大值的大小关系;
步骤502,在当前序列值等于数据库序列最大值时,从数据库序列中获取第一个步长序列作为当前步长序列。
为了防止数据库序列在使用时超出数据库序列的适用范围,即超出数据库序列的最大值,在将当前步长序列的当前序列值加一之后,判断当前序列值和数据库序列最大值之间的大小关系。在当前序列值等于数据库序列最大值时,说明数据库序列的使用即将超出数据库序列可使用的范围,此时从数据库序列中获取第一个步长序列作为当前步长序列,并将当前步长序列的起始序列值作为当前序列值,即循环使用数据库序列。
在当前序列值小于数据库序列最大值时,说明数据库序列的使用并未超出数据库序列可使用的范围,此时可无需从数据库序列中获取第一个步长序列。
鉴于步长序列是数据库序列中的序列,且步长序列的使用次数和步长序列中的序列值的数量是相一致的,在步长序列的使用次数不大于序列步长时,说明不会超出步长序列的适用范围,因此,便也不会超出数据库序列的使用范围。即在步长序列的使用次数不大于序列步长时,当前序列值肯定不会大于数据库序列最大值,此时无需每次在将当前步长序列的当前序列值加一之后,均获取当前序列值与数据库序列最大值的大小关系。而只有在步长序列的使用次数等于序列步长时,才存在当前序列值等于数据库序列最大值的情况。
因此,在本发明的一实施例中,只需在步长序列的使用次数等于序列步长时,获取当前序列值与数据库序列最大值的大小关系。若此时当前序列值等于数据库序列最大值,说明数据库序列的使用即将超出数据库序列可使用的范围,此时从数据库序列中获取第一个步长序列作为当前步长序列。这样无需在每次接收到序列请求时,均执行一次获取当前序列值与数据库序列最大值的大小关系的步骤,进一步降低了数据库序列的资源成本,提高了数据库序列的处理性能。
在本发明实施例中,获取当前序列值与数据库序列最大值的大小关系,在当前序列值等于数据库序列最大值时,从数据库序列中获取第一个步长序列作为当前步长序列,可以循环使用数据库序列,进一步提高数据库序列的处理性能。
与上述实施例中“从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值”相类似的,在本发明的一实施例中,从数据库序列中获取第一个步长序列作为当前步长序列,同样将第一个步长序列的起始序列值作为当前序列值。一般来讲,第一个步长序列的起始序列值即为数据库序列最小值。在默认的情况下,第一个步长序列的起始序列值,即数据库序列最小值为1。
本发明实施例的实施,具体可参考上述实施例中“从序列仓库中的步长序列中获取新的步长序列作为当前步长序列时,将当前步长序列的起始序列值作为当前序列值”相关实施例的描述部分,此处不再详细赘述。
以下结合一数据库序列的使用过程,对本发明的工作原理进行说明:
首先创建一个数据库序列,设置该数据库序列的数据库序列最小值为1,数据库序列最大值为10000,每个步长序列包含500个序列值,那么该数据库序列即包括20个步长序列。为描述的方便,可以将该20个步长序列依次编号为第一个至第二十个步长序列。另外,设置序列仓库大小为12,即序列仓库中最多可以缓存12个步长序列。最后设置仓库管理员异步线程每隔5秒钟检查一次序列仓库中步长序列的数量。
在节点服务器第一次启动时,从数据库序列中获取第一个步长序列作为当前步长序列,并将第一个步长序列的起始序列值作为当前序列值,即1为当前序列值,与此同时,启动仓库管理员异步线程。此时,将第一个步长序列的使用次数初始化为零,在接收到序列请求时,由于第一个步长序列的使用次数0小于序列步长,此时利用当前序列值1生成序列号,同时将第一个步长序列的使用次数加1,则第一个步长序列的使用次数此时由0变为1,之后将当前序列1值加一,则当前序列值由1变为2。
在第二次接收到序列请求时,将第一个步长序列的使用次数1依然小于序列步长,此时利用当前序列值2生成序列号,同时将第一个步长序列的使用次数1加1,则第一个步长序列的使用次数此时由1变为2,之后将当前序列1值加一,则当前序列值由2变为3。
如此循环往复,直至当前序列值为499时,在又一次接收序列请求之前,第一个步长序列的使用次数应为498,此时第一个步长序列的使用次数498依然小于序列步长500,此时利用当前序列值499生成序列号,同时将第一个步长序列的使用次数498加1,则第一个步长序列的使用次数此时由498变为499,之后将当前序列499值加1,则当前序列值由499变为500。
然后,在又一次接收到序列请求时,第一个步长序列的使用次数499依然小于序列步长,此时利用当前序列值500生成序列号,同时将第一个步长序列的使用次数499加1,则第一个步长序列的使用次数此时由499变为500,而步长序列的使用次数为500时,不再将当前序列值500累加1,而是获取节点服务器中序列仓库中步长序列的数量,假设此时节点服务器中序列仓库中缓存有第二个步长序列至第十三个步长序列,那么仓库序列中步长序列的数量大于零,从序列仓库中获取第二个步长序列作为当前步长序列。而后在从序列仓库中获取第二个步长序列作为当前步长序列时,将第二个步长序列的起始序列值501作为当前序列值。与第一个步长序列的最后一个序列值500正好衔接上。
而后将第二个步长序列的使用次数初始化为零,进而在接收到序列请求时,此时第二个步长序列的使用次数0小于序列步长,此时利用当前序列值501生成序列号,同时将第二个步长序列的使用次数0加1,则第二个步长序列的使用次数此时由0变为1,之后将当前序列501值加1,则当前序列值由501变为502。之后的处理过程与上述第一个步长序列的处理过程相似,具体请参见上述相关内容的描述,此处不在详细赘言。
假设在数据库序列处理的过程中,在即将使用第五个步长序列时,节点服务器重新启动,此时,从节点服务器中获取第五个步长序列作为当前步长序列,第五个步长序列的起始序列值2501作为当前序列值,直至节点服务器下次重新启动服务,节点服务器两次重启之间的处理过程上述相似,此处不再赘言。
在数据库序列处理的过程中,假设仓库管理员异步线程,按照5秒的时间间隔,每隔5秒检测序列仓库中可用步长序列的数量。假设某一时刻仓库管理员异步线程检测到序列仓库中可用步长序列的数量仅为5个,说明序列仓库中可用步长序列的数量小于12,此时从数据库序列中获取7个步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于12个。
另外,假设获取到序列仓库中可用步长序列的数量为零,说明序列仓库中已没有可以在当前使用的步长序列,此时临时从数据库序列中获取新的步长序列作为当前步长序列。以便在仓库管理员异步线程从数据库序列中补充新的步长序列至序列仓库后,重新从序列仓库中获取步长序列。
在数据库序列处理的过程中,在当前步长序列的使用次数不大于序列步长时,在每次接收序列请求后,均需要利用当前步长序列的当前序列值生成序列号。在当前步长序列的使用次数小于序列步长时,在每次接收序列请求后,将当前步长序列的当前序列值加一,而只有在当前步长序列的使用次数等于序列步长,例如在第一个步长序列的使用次数500等于序列步长时,依然利用当前步长序列的当前序列值500生成序列号,但是已不再将当前步长序列的当前序列值500加一,而是从序列仓库中获取新的步长序列(第二个步长序列)作为当前步长序列,并将新的步长序列的起始序列值501作为当前序列值。
另外,在本发明的实施例中,在每次将当前步长序列的当前序列值加一之后,或者是在当前步长序列的使用次数等于序列步长500时,还可以获取当前序列值与数据库序列最大值10000的大小关系,在当前序列值不大于数据库序列最大值10000时,依然在每次接收序列请求后,均执行利用当前步长序列的当前序列值生成序列号的步骤。在当前序列值小于数据库序列最大值10000时,在每次接收序列请求后,将当前步长序列的当前序列值加一,而只有在当前序列值(此时当前序列值应当为10000)等于数据库序列最大值10000时,依然利用当前步长序列(第二十个步长序列)的当前序列值10000生成序列号,但是已不再将当前步长序列的当前序列值10000加一,而是从数据库序列中获取新的步长序列(第一个步长序列)作为当前步长序列,并将新的步长序列的起始序列值1作为当前序列值,以便循环使用数据库序列。
本发明实施例中还提供了一种基于同步锁的节点服务器,如下面的实施例所述。由于基于同步锁的节点服务器解决问题的原理与数据库序列处理方法相似,因此基于同步锁的节点服务器的实施可以参见数据库序列的处理方法的实施,重复之处不再赘述。
图6示出了本发明第六实施例提供的基于同步锁的节点服务器的功能模块,为便于说明,仅示出了与本发明实施例相关的部分,详述如下:
参考图6,所述基于同步锁的节点服务器所包含的各个模块用于执行图1对应实施例中的各个步骤,具体请参阅图1以及图1对应实施例中的相关描述,此处不再赘述。本发明实施例中,所述基于同步锁的节点服务器包括初始化模块601、数量获取模块602及步长序列获取模块603。
初始化模块601,用于将当前步长序列的使用次数初始化为零;
数量获取模块602,用于在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
步长序列获取模块603,用于在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。
在本发明实施例中,初始化模块601将当前步长序列的使用次数初始化为零,数量获取模块602在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列,步长序列获取模块603在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。在本发明实施例中,步长序列获取模块603在节点服务器的序列仓库中缓存的步长序列的数量大于零时,从节点服务器的序列仓库中获取新的步长序列作为当前步长序列,完全为节点服务器内存操作,其避免了和数据库序列的交互,可以降低数据库序列的资源成本,提高数据库序列的处理性能。
图7示出了本发明第七实施例提供的基于同步锁的节点服务器的功能模块,为便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,参考图7,所述基于同步锁的节点服务器所包含的各个模块用于执行图2对应实施例中的各个步骤,具体请参阅图2以及图2对应实施例中的相关描述,此处不再赘述。在上述图1所示模块结构的基础上,所述基于同步锁的节点服务器,还包括数量检测模块701和补充模块702。
数量检测模块701,用于基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量。
补充模块702,用于若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量。
在本发明实施例中,数量检测模块701基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量,补充模块702若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量,可以进一步降低与数据库序列的交互次数,提高数据库序列的处理性能。
在本发明的一实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,步长序列获取模块603,还用于:
在序列仓库中步长序列的数量等于零时,从数据库序列中获取新的步长序列作为当前步长序列。
本发明实施例中,基于同步锁的节点服务器所包含的各个模块用于执行图3对应实施例中的各个步骤,具体请参阅图3以及图3对应实施例中的相关描述,此处不再赘述。
在本发明实施例中,步长序列获取模块603在序列仓库中步长序列的数量等于零时,从数据库序列中获取新的步长序列作为当前步长序列,可以避免影响序列的使用,进一步提高数据库序列的处理性能。
图8示出了本发明第八实施例提供的基于同步锁的节点服务器的功能模块,为便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,参考图8,所述基于同步锁的节点服务器所包含的各个模块用于执行图4对应实施例中的各个步骤,具体请参阅图4以及图4对应实施例中的相关描述,此处不再赘述。本发明实施例中,在上述所述模块结构的基础上,所述基于同步锁的节点服务器,还包括累加模块801。
所述累加模块801,用于在当前步长序列的使用次数不大于序列步长时,在每次接收序列请求后,利用当前步长序列的当前序列值生成序列号;
在当前步长序列的使用次数小于序列步长时,在每次接收序列请求后,将当前步长序列的当前序列值加一,直至当前步长序列的使用次数等于序列步长。
图9示出了本发明第九实施例提供的基于同步锁的节点服务器的功能模块,为便于说明,仅示出了与本发明实施例相关的部分,详述如下:
在本发明一的实施例中,为了进一步降低数据库序列的资源成本,提高数据库序列的处理性能,参考图9,所述基于同步锁的节点服务器所包含的各个模块用于执行图5对应实施例中的各个步骤,具体请参阅图5以及图5对应实施例中的相关描述,此处不再赘述。本发明实施例中,在上述所述模块结构的基础上,所述基于同步锁的节点服务器,还包括大小关系获取模块901和循环模块902。
大小关系获取模块901,用于获取当前序列值与数据库序列最大值的大小关系。
循环模块902,用于在当前序列值等于数据库序列最大值时,从数据库序列中获取第一个步长序列作为当前步长序列。
在本发明实施例中,大小关系获取模块901获取当前序列值与数据库序列最大值的大小关系,循环模块902在当前序列值等于数据库序列最大值时,从数据库序列中获取第一个步长序列作为当前步长序列,可以循环使用数据库序列,进一步提高数据库序列的处理性能。
本发明实施例还提供一种数据库序列处理系统,包括多个上述实施例所述的基于同步锁的节点服务器,多个节点服务器采用集群或者分布式部署方式。
为了进一步的降低数据库序列的资源成本,提高数据库序列的处理性能,本发明的发明人将数据库序列的同步锁分解到每个节点服务器中,由每个节点服务器维护各自的同步锁,提高同步锁的使用效率,进一步提高数据库序列的处理性能。
本发明实施例还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述数据库序列处理方法。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有执行上述数据库序列处理方法的计算机程序。
综上所述,本发明实施例将当前步长序列的使用次数初始化为零,在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列,在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。在本发明实施例中,在节点服务器的序列仓库中缓存的步长序列的数量大于零时,从节点服务器的序列仓库中获取新的步长序列作为当前步长序列,完全为节点服务器内存操作,其避免了和数据库序列的交互,可以降低数据库序列的资源成本,提高数据库序列的处理性能。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种数据库序列处理方法,其特征在于,应用于基于同步锁的节点服务器中,包括:
将当前步长序列的使用次数初始化为零;
在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列,重新执行前述步骤。
2.如权利要求1所述的数据库序列处理方法,其特征在于,还包括:
基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量;
若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量。
3.如权利要求1所述的数据库序列处理方法,其特征在于,还包括:
在序列仓库中步长序列的数量等于零时,从数据库序列中获取新的步长序列作为当前步长序列。
4.如权利要求1所述的数据库序列处理方法,其特征在于,还包括:
在当前步长序列的使用次数不大于序列步长时,在每次接收序列请求后,利用当前步长序列的当前序列值生成序列号;
在当前步长序列的使用次数小于序列步长时,在每次接收序列请求后,将当前步长序列的当前序列值加一,直至当前步长序列的使用次数等于序列步长。
5.如权利要求4所述的数据库序列处理方法,其特征在于,在将当前步长序列的当前序列值加一之后,还包括:
获取当前序列值与数据库序列最大值的大小关系;
在当前序列值等于数据库序列最大值时,从数据库序列中获取第一个步长序列作为当前步长序列。
6.一种基于同步锁的节点服务器,其特征在于,包括:
初始化模块,用于将当前步长序列的使用次数初始化为零;
数量获取模块,用于在每次接收到序列请求后将当前步长序列的使用次数加一,直至当前步长序列的使用次数等于序列步长,获取节点服务器的序列仓库中步长序列的数量;所述序列仓库用于缓存步长序列;
步长序列获取模块,用于在序列仓库中步长序列的数量大于零时,从序列仓库中的步长序列中获取新的步长序列作为当前步长序列。
7.如权利要求6所述的基于同步锁的节点服务器,其特征在于,还包括:
数量检测模块,用于基于异步线程,按照预设时间间隔检测序列仓库中可用步长序列的数量;
补充模块,用于若序列仓库中可用步长序列的数量小于预设数量,从数据库序列中获取步长序列补充到序列仓库中,以使补充后序列仓库中步长序列的数量等于预设数量。
8.一种数据库序列处理系统,其特征在于,包括多个如权利要求6或7所述的基于同步锁的节点服务器,多个节点服务器采用集群或者分布式部署方式。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至5任一所述方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行权利要求1至5任一所述方法的计算机程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910007420.5A CN109753544B (zh) | 2019-01-04 | 2019-01-04 | 数据库序列处理方法、系统及基于同步锁的节点服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910007420.5A CN109753544B (zh) | 2019-01-04 | 2019-01-04 | 数据库序列处理方法、系统及基于同步锁的节点服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109753544A true CN109753544A (zh) | 2019-05-14 |
CN109753544B CN109753544B (zh) | 2021-01-01 |
Family
ID=66405352
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910007420.5A Active CN109753544B (zh) | 2019-01-04 | 2019-01-04 | 数据库序列处理方法、系统及基于同步锁的节点服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109753544B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111949730A (zh) * | 2020-08-12 | 2020-11-17 | 中国银行股份有限公司 | 分布式全局序列号实现方法及序列分发器 |
CN113297327A (zh) * | 2021-05-24 | 2021-08-24 | 建信金融科技有限责任公司 | 生成分布式id的系统和方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140025634A1 (en) * | 2012-07-18 | 2014-01-23 | International Business Machines Corporation | Generating database sequences in a replicated database environment |
CN105447667A (zh) * | 2015-11-17 | 2016-03-30 | 成都信息工程大学 | 快递订单的自动分配方法 |
CN107038191A (zh) * | 2016-11-15 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种数据库序列的数据处理方法、装置及服务器 |
CN107247770A (zh) * | 2017-06-05 | 2017-10-13 | 广东亿迅科技有限公司 | 基于zookeeper的全局序列生成方法及装置 |
CN108733776A (zh) * | 2018-05-02 | 2018-11-02 | 山东求同网信息科技有限公司 | 企业物料通用动态列名编码方法及编制系统 |
CN108763172A (zh) * | 2018-05-18 | 2018-11-06 | 郑州云海信息技术有限公司 | 一种Linux系统下自动生成客户定制化序列号的方法及装置 |
-
2019
- 2019-01-04 CN CN201910007420.5A patent/CN109753544B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140025634A1 (en) * | 2012-07-18 | 2014-01-23 | International Business Machines Corporation | Generating database sequences in a replicated database environment |
CN105447667A (zh) * | 2015-11-17 | 2016-03-30 | 成都信息工程大学 | 快递订单的自动分配方法 |
CN107038191A (zh) * | 2016-11-15 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 一种数据库序列的数据处理方法、装置及服务器 |
CN107247770A (zh) * | 2017-06-05 | 2017-10-13 | 广东亿迅科技有限公司 | 基于zookeeper的全局序列生成方法及装置 |
CN108733776A (zh) * | 2018-05-02 | 2018-11-02 | 山东求同网信息科技有限公司 | 企业物料通用动态列名编码方法及编制系统 |
CN108763172A (zh) * | 2018-05-18 | 2018-11-06 | 郑州云海信息技术有限公司 | 一种Linux系统下自动生成客户定制化序列号的方法及装置 |
Non-Patent Citations (1)
Title |
---|
ARESCARRY: "使用悲观锁实现线程同步,实现秒杀效果", 《HTTPS://BLOG.CSDN.NET/KISSCATFOREVER/ARTICLE/DETAILS/54291469》 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111949730A (zh) * | 2020-08-12 | 2020-11-17 | 中国银行股份有限公司 | 分布式全局序列号实现方法及序列分发器 |
CN111949730B (zh) * | 2020-08-12 | 2023-09-19 | 中国银行股份有限公司 | 分布式全局序列号实现方法及序列分发器 |
CN113297327A (zh) * | 2021-05-24 | 2021-08-24 | 建信金融科技有限责任公司 | 生成分布式id的系统和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN109753544B (zh) | 2021-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109643310B (zh) | 用于数据库中数据重分布的系统和方法 | |
JP3779263B2 (ja) | 共同作業システムのためのコンフリクトの解決 | |
CN100573457C (zh) | 一种金融数据实现etl加工的方法和系统 | |
CN109753544A (zh) | 数据库序列处理方法、系统及基于同步锁的节点服务器 | |
US8499298B2 (en) | Multiprocessing transaction recovery manager | |
CN110309161A (zh) | 一种数据同步方法、装置及服务器 | |
CN109992624A (zh) | 一种区块链Block chain的同步存储方法、装置及计算机设备 | |
CN109284339A (zh) | 一种数据库数据实时同步的方法和装置 | |
CN112383610A (zh) | 区块链状态数据的同步处理方法及系统 | |
CN102023899B (zh) | 多线程数据同步方法及装置 | |
JP2023546897A (ja) | オブジェクト処理方法、装置、及びコンピュータ機器 | |
CN107894926B (zh) | 一种银行影像录入任务的同步和分配系统及方法 | |
CN102497410B (zh) | 一种云计算系统计算资源动态分区的方法 | |
Shao et al. | Page: A partition aware graph computation engine | |
CN113901141B (zh) | 一种分布式数据同步方法及系统 | |
CN109635040B (zh) | 实时数据迁移方法、装置及存储介质 | |
Liu et al. | A transactional approach to parallel data warehouse maintenance | |
JPH04152465A (ja) | データ処理システム及びデータ処理方法 | |
CN113985826B (zh) | 面向多运算周期的实时值加载方法和系统、设备及存储介质 | |
EP1965319A2 (en) | Transaction processing system and method | |
US8260814B2 (en) | Method and an arrangement for concurrency control of temporal data | |
CN103970854A (zh) | Sap ecc端与sap bw端之间增量凭证信息同步方法 | |
CN115794837B (zh) | 数据表的同步方法、系统和电子设备及存储介质 | |
CN110688426B (zh) | 一种区块链大数据库的秒级心跳同步方法 | |
CN115309821A (zh) | 大数据平台主数据实时同步方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |