掌桥专利:专业的专利平台
掌桥专利
首页

数据存储的方法、装置、电子设备和可读介质

文献发布时间:2023-06-19 11:49:09


数据存储的方法、装置、电子设备和可读介质

技术领域

本申请涉及计算机技术领域,尤其涉及一种数据存储的方法、装置、电子设备和可读介质。

背景技术

分布式数据库系统是一种可以将数据分别存储在不同地理位置的物理节点上并且通过网络连接进行访问的数据库。该类数据库通常用于办公地点分散于各地的企业或者在各地均有用户接入的场景。在该类数据库中,新数据存储时如何生成数据表的唯一键是数据库核心功能。

目前,分布式数据库中唯一键的生成方法通常采用发号服务器的方式。客户端需要新的唯一键时需要向发号服务器申请,发号服务器利用后端的序列号数据库生成新的唯一键,以供客户端使用。

然而,现有方案中,唯一键的生成依赖于序列号数据库,在序列号数据库的宕机或响应较慢时会对整个应用系统造成应用系统不可用或效率降低,从而影响系统的稳定性。

发明内容

基于上述技术问题,本申请提供一种数据存储的方法,以简化了系统结构,避免发号数据库的故障对于整个系统的影响,从而提升系统的稳定性。

本申请的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本申请的实践而习得。

根据本申请实施例的一个方面,提供一种数据存储的方法,包括:

获取数据插入指令,其中,所述数据插入指令包括目标数据库中目标数据表的表标识以及待添加数据;

获取所述目标数据库中上一次插入的数据所对应的第一主键值,以及获取所述目标数据库对应的步长值和模值,其中,所述步长值用于指示主键值的递增量,所述模值用于指示主键值与所述步长值的余数;

根据所述第一主键值、所述步长值和所述模值,生成待插入主键值;

根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表。

根据本申请实施例的一个方面,提供一种数据存储装置,包括:

指令获取模块,用于获取数据插入指令,其中,所述数据插入指令包括目标数据库中目标数据表的表标识以及待添加数据;

主键获取模块,用于获取所述目标数据库中上一次插入的数据所对应的第一主键值,以及获取所述目标数据表对应的步长值和模值,其中,所述步长值用于指示主键值的递增量,所述模值用于指示主键值与所述步长值的余数;

主键生成模块,用于根据所述第一主键值、所述步长值和所述模值,生成待插入主键值;

数据插入模块,用于根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表。

在本申请的一些实施例中,基于以上技术方案,数据存储装置还包括:

主键值计算模,用于若所述待插入主键值小于所述用户指定主键,则根据所述用户指定主键、所述步长值和所述模值,计算第二主键值;

主键值更新模块,用于根据所述第二主键值和所述待添加数据的数量,更新所述待插入主键值。

在本申请的一些实施例中,基于以上技术方案,主键获取模块,包括:

标识获取单元,用于根据所述表标识,获取所述目标数据库的插入标识以及目标数据库中最近一次插入操作所对应的待处理主键值,所述插入标识用于指示对于所述目标数据库的最近一次更新操作成功或失败;

最大值获取单元,用于若所述插入标识指示最近一次更新操作失败或者所述待处理主键值为零,则获取所述目标数据表中所有主键值中的最大值作为第一主键值;

主键值确定单元,用于若所述插入标识指示最近一次更新操作成功或者所述待处理主键值大于零,则将所述待处理主键值确定为所述第一主键值。

在本申请的一些实施例中,基于以上技术方案,数据存储装置还包括:

响应接收模块,用于接收对所述目标数据表的插入操作的插入响应信息;

标识更新模块,用于若所述插入响应信息指示对于所述目标数据表的插入操作失败,则更新所述目标数据库的插入标识。

在本申请的一些实施例中,基于以上技术方案,数据插入模块,包括:

请求生成单元,用于在数据库接入层中根据所述表标识、所述待插入主键值和所述待添加数据生成数据插入请求;

请求发送单元,用于向所述目标数据库发送所述数据插入请求;

其中,所述数据库接入层包括第一接入节点和第二接入节点,所述第一接入节点的步长值与所述第二接入节点的步长值相同,所述第一接入节点的模值与所述第二接入节点的模值不同。

在本申请的一些实施例中,基于以上技术方案,主键生成模块,包括:

加锁单元,用于针对所述第一主键值进行加锁操作;

中间值计算单元,用于根据所述第一主键值和所述步长值,计算中间值;

主键确定单元,用于将所述中间值与所述模值的和确定为待插入主键值;

解锁单元,用于针对所述第一主键值进行解锁操作。

在本申请的一些实施例中,基于以上技术方案,主键生成模块,包括:

更新主键计算单元,用于根据所述第一主键值、所述步长值和所述模值,计算第一更新主键值;

序列计算单元,用于根据所述第一更新主键值、所述数据插入指令中所述待添加数据的数量和所述步长值,计算对应于所述多个待添加数据的待插入主键值序列。

根据本申请实施例的一个方面,提供一种电子设备,该电子包括:处理器;以及存储器,用于存储处理器的可执行指令;其中,该处理器配置为经由执行可执行指令来执行如以上技术方案中的数据存储的方法。

根据本申请实施例的一个方面,提供一种计算机可读存储介质,其上存储有计算机程序,当该计算机程序被处理器执行时实现如以上技术方案中的数据存储的方法。

根据本申请实施例的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各种可选实现方式中提供数据存储的方法。

在本申请的实施例中,根据数据插入指令,从数据库中获取最近一次插入的主键值,然后根据数据库对应的步长和模值,计算新数据对应的新主键值,然后将新主键值和待更新数据值插入数据库来进行新数据存储。获取新主键值的过程由存储数据的数据库本身即可完成,而不再需要额外发号数据库来生成新主键,从而简化了系统结构,避免发号数据库的故障对于整个系统的影响,从而提升系统的稳定性。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

在附图中:

图1示意性地示出了本申请技术方案在一个应用场景中的示例性物理架构示意图;

图2为本申请实施例中系统架构的示意图;

图3示出了本申请实施例中的一种数据存储的方法的流程示意图;

图4为本身申请实施例中包括异常处理的主键值生成过程的流程图;

图5为本申请实施例中生成主键值的结构示意图;

图6为本申请实施例中采用线程锁的主键值生成过程的流程图;

图7示意性地示出了本申请实施例中数据存储装置的组成框图;

图8示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。

具体实施方式

现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本申请将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。

此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。

附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。

附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。

应理解,本申请的方案可以应用于分布式数据库系统中。在此类场景中,也数据被存储在不同的物理设备上,并且通常,不同的物理设备也被放置于不同的地理位置。各个设备上均具有局部的数据库,并且也具有相应的数据库管理功能。多台设备通过网络通信,共同构成完成的分布式数据库。在各个设备的数据库中,需要保证数据表中数据主键的唯一性。本申请方案应用于此类场景可以让不同地理位置的设备各自对本地的数据库进行管理,在需要插入新数据时,直接由本地的数据库接入设备根据本地业务数据库的内容生成新主键,而不同地理位置的各个数据局不需要相互通信也能够保持生成的主键不产生冲突。

本申请的应用场景通常为包括多台设备或服务器的联机系统。为了便于介绍,请参阅图1,图1示意性地示出了本申请技术方案在一个应用场景中的示例性物理架构示意图。

由图1可以看出,该场景包括接入设备、数据库以及终端、笔记本电脑等终端设备各类不同的终端设备。多种终端设备可以通过接入设备对业务数据进行访问。终端设备在需要对某个数据表进行插入时,向接入设备发送插入请求。接入设备根据本申请的方案对插入请求中的插入内容生成主键,并且将主键和插入内容发送给数据库。数据库根据接收到的主键和插入内容进行数据表的新数据存储。然后将插入操作的结果发发送回给终端设备,从而完成整体的数据存储过程。

图1中所示的接入设备可以包括多个接入设备,相对应的数据库也可以包括多个数据库。每个接入设备分别对应于一个或多个数据库。同一个数据库通常由一台接入设备管理。

客户端与接入设备之间的通信方式以及接入设备与数据库之间的通信方式可以采用任何有线或无线通信方式,本申请对此不作限制。

可以理解的是,图1中所示出的场景仅为本申请的方案所应用的场景示例,实际的应用场景可以采用其他适合网络结构,例如加入代理服务器和多级网络等,本申请对此不作限制。

基于图1中所示的物理架构,本申请的方案可以应用于集群式的逻辑系统架构。具体地,为了便于介绍,请参阅图2,图2为本申请实施例中系统架构的示意图。如图2所示,该系统结构主要包括应用层、接入层、访问层和数据层组成。应用层用于与客户端进行业务通信和业务逻辑的处理。接入层用于允许来自应用层的请求对数据层进行访问。访问层用于支持数据定义语言类型的访问语句到各个数据库的路由工作。数据层对应于各个数据库,主要负责实际存储数据。如图2所示,接入层中包括多个接入装置,而数据层中也包括多个局部数据库。每个接入装置负责管理各自独有的一个或者多个局部数据库。接入层中的接入装置会根据配置好的数据路由规则对接收到的数据访问请求中的数据库结构化查询语句进行改写,然后再分发到相应的局部数据库进行执行,局部数据库在执行查询语句的相应操作后向上反馈结果到应用层,从而完成数据的新增、删除、更新和查询等操作。

下面结合具体实施方式对本申请提供的技术方案做出详细说明。

请参阅图3,图3示出了本申请实施例中的一种数据存储的方法的流程示意图,本实施例的方法可以应用于如上文所述的服务器中,由服务器上的后台程序来执行。本实施例的方法可以包括如下步骤S201至步骤S204:

步骤S201,获取数据插入指令,其中,所述数据插入指令包括目标数据库中目标数据表的表标识以及待添加数据。

其中,数据插入指令来源于应用层的客户端的请求。在具体的实现中,客户端根据业务的需求确定需要查询的数据表,从而确定数据表的表标识。表标识通常是表名。具体地,数据插入指令中包括用于添加新数据的数据库指令,数据库指令的具体格式取决于数据层的数据库的具体实现方式。

步骤S202,获取所述目标数据库中上一次插入的数据所对应的第一主键值,以及获取所述目标数据表对应的步长值和模值,其中,所述步长值用于指示主键值的递增量,所述模值用于指示主键值与所述步长值的余数。

具体地,获取可以从数据库中目标数据库中上一次插入的数据所对应的第一主键值。所获取的第一主键值不依赖于目标数据表的更新过程,即如果先向数据表A插入数据,再向数据表B插入数据,则获取从数据库获取到的第一主键值为向数据表B插入的主键值。对于单个局部数据库,步长值和模值的是固定值。步长值和模值可以配置在接入层中的设备中,也可以作为数据库的配置参数,或者直接存储在数据库的数据表中。

本申请的分布式存储系统中配置有相关参数以便于控制主键值的生成过程。具体参数包括模式切换参数、递增步长参数以及模值参数。切换参数用于在本方案的主键生成方式和数据库默认的主键生成方式之间进行切换。递增步长参数以及模值参数则分别用于存储步长值和模值。上述参数可以配置在接入层和数据层,并且接入装置与其管理的局部数据库的参数配置相同。对于模式切换参数,不同局部数据库或者不同接入装置中的参数配置可以不同。对于递增步长参数以及模值参数,在同一个集群中的所有接入装置的递增步长参数的值应该是相同的,而模值参数的值是互相不同的,以便保证所生成的主键值之间不会重复。

步骤S203,根据所述第一主键值、所述步长值和所述模值,生成待插入主键值。

在本实施例中,待插入主键值的计算方式可以采用第一主键值与步长值求和的方式。采用此计算方式时,每个数据库生成的第一个主键值可以直接使用模值。

目标数据表被创建时,取决于数据库所采用的具体实现方式不同,主键对应的主键列可以被添加特定设置规则或者触发器规则。例如,主键列可以被声明为自增量。若数据存储请求中的插入语句并未添加主键列的主键或者将主键设置为0或空值,则数据库可以自动按照预设的步长和模值为本次的插入操作生成主键值。通过这样的方式,可以将主键值的递增过程在数据库进行,从而保证了更上级的应用不需要进行修改而直接可以与该主键值生成过程集成,从而不会由于主键生成方式切换而需要修改应用层逻辑,避免增加额外的工作,降低生产效率。

步骤S204,根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表。

具体地,服务器可以直接通过数据库指令向目标数据表中插入所述待插入主键值和所述待添加数据。具体地,服务器可以直接根据数据库插入指令的格式,利用表标识、待插入主键值和待添加数据生成对应的插入指令,并且根据插入指令向目标数据表中插入待插入主键值和待添加数据。可以理解的是,针对数据表的插入操作可以理解为向数据表中添加新数据,而在数据表中添加的位置不做限制,可以添加在数据表的最后一行,也可以插入已经存在的两行之间。

在本申请的实施例中,根据数据插入指令,从数据库中获取最近一次插入的主键值,然后根据数据库对应的步长和模值,计算新数据对应的新主键值,然后包括新主键值和待更新数据值的插入数据表来进行新数据存储。获取新主键值的过程根据存储数据的数据库本身即可完成,而不再需要额外发号数据库来生成新主键,从而简化了系统结构,避免发号数据库的故障对于整个系统的影响,从而提升系统的稳定性。

在本申请的一个实施例中,用户可以指定待添加数据的主键值。数据插入指令中包括用户指定主键。上述步骤S203根据所述第一主键值、所述步长值和所述模值,生成待插入主键值之后,方法还包括:

若所述待插入主键值小于所述用户指定主键,则根据所述用户指定主键、所述步长值和所述模值,计算第二主键值;

根据所述第二主键值和所述待添加数据的数量,更新所述待插入主键值。

其中,用户指定主键需要符合对应的服务器所具有的主键值生成规程。例如,若服务器的步长值为4,模值为1,则其所生成的主键值序列应是可以用4x+1来表示,其中x为整数,即1、5、9、…、4x+1的序列中一个数字。用户若指定序列之外的主键值,则不会被添加到数据表中。在一个实施例中,服务器在接收到数据插入指令时,会对其中的用户指定主键进行检查,若不符合条件,则会直接向客户端报错。用户指定主键的规则也可以在客户端上进行控制。例如,客户端预先获取服务器的步长值和模值,用户在客户端上输入主键值时,直接向提示输入规则并且进行输入值的检查,或者直接向用户提供选项供用户选择。

对于符合条件的用户指定主键,在计算得到待插入主键值之后,将会比较用户指定主键与待插入主键值。若所述待插入主键值小于所述用户指定主键,则表示用户指定主键在目标数据表中不存在,而可以被插入到数据库中。在本实施例中,服务器根据所述用户指定主键、所述步长值和所述模值,计算第二主键值。第二主键值的计算过程与待插入主键值的计算过程相同。随后,可以根据待添加数据的数量来确定待插入主键值的取值。具体地,在只有一个待添加数据的情况下,第二主键值是成为待插入主键值在主键值序列中的下一个值,此时,可以将待插入主键直接替换为用户指定主键。相对应地,在存在多个待添加数据的情况下,待插入主键值是包括多个主键值的序列,而第二主键值则是序列最大值,根据第二主键值可以确定大于待插入主键值的一个取值范围,此时,则将待插入主键值的序列中的值依次替换为根据以第二主键值为最大值的主键值序列内的值。举例说明,若待插入主键值为13、17和21,此时用户指定主键为25,则由于25大于21,因此,可以计算的到第二主键值为25、29、33,因此,将待插入主键替换为25、29、33。

在本实施例中,根据用户提供的主键值来更新待插入主键值,允许用户自行定义主键值,提升方案的灵活性。

在一个实施例中,为了应对服务器在运行过程中的异常情况,上述步骤S202获取所述目标数据库中上一次插入的数据所对应的第一主键值,可以包括如下步骤:

根据所述表标识,获取所述目标数据库的插入标识以及目标数据库中最近一次插入操作所对应的待处理主键值,所述插入标识用于指示对于所述目标数据表的最近一次更新操作成功或失败;

若所述插入标识指示最近一次更新操作失败或者所述待处理主键值为零,则获取所述目标数据库中所有主键值中的最大值作为第一主键值;

若所述插入标识指示最近一次更新操作成功或者所述待处理主键值大于零,则将所述待处理主键值确定为所述第一主键值。

具体地,在获取目标数据库中最近一次插入操作所对应的待处理主键值时,还会获取目标数据库的插入标识,该插入标识用于指示对于所述目标数据表的最近一次更新操作成功或失败。

在服务器的运行过程中,异常情景通常包括主键值发生重复导致插入失败以及服务器重启或宕机、删除表格导致所获得的最近一次插入操作的主键值为0。因此,需要根据插入标识以及待处理主键值来判断目前所获得的待处理主键值是否可以用于进行主键值计算。

为了便于介绍,请参阅图4,图4为本身申请实施例中包括异常处理的主键值生成过程的流程图。在本实施例中,除了获取第一主键值,接入装置还会获取目标数据表的插入标识,插入标识用于指示对于所述目标数据表的最近一次更新操作成功或失败。该插入标识可以存储在数据库中。此外,若所获取到的主键值为零,可以确定数据库端发生过故障或者进行过重启。接入装置根据所获取到的第一主键值和插入标识判断,当前的第一主键值是否可以用于计算下一主键值。若所获得的第一主键值为0,或者插入标识指示上一次插入失败,则将会从目标数据表中获取最大的主键值作为第一主键值来继续进行计算。此外,在获取最大主键值后,还会将目标数据表的插入标识更新为插入成功。

在一个实施例中,目标数据库将包含一张主键值表。目标数据库中所有采用自动递增规则的表格的主键值均来自于主键值表,目标数据表和数据库中其他表格的所有主键值被存储在主键值表中。此时,若所获得的第一主键值为0,或者插入标识指示上一次插入失败,则获取主键值表中的最大值来作为第一主键值进行后续计算。

在本申请的实施例中,通过所获得的待处理主键值以及数据库的插入标识判断之前的插入过程是否出现错误,从而可以避免插入过程出错导致计算出的主键值错误而无法进行后续的插入过程,提升了系统的稳定性。

在一个实施例中,上述步骤S204,根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表之后,本方法还可以包括如下步骤:

接收对所述目标数据表的插入操作的插入响应信息;

若所述插入响应信息指示对于所述目标数据表的插入操作失败,则更新所述目标数据表的插入标识。

在本实施例中,服务器在进行插入过程中后,将会接收对所述目标数据表的插入操作的插入响应信息。插入响应信息为插入过程结束后由数据库生成的插入结果反馈。在插入过程正确完成的情况下,插入响应信息将包括插入成功信息,若插入过程出现错误,则插入响应信息可以包括错误详情,例如错误编码等。若所述插入响应信息指示对于所述目标数据表的插入操作失败,则更新所述目标数据表的插入标识。具体地,请再次参阅图4,在向数据库发送数据存储请求后,数据库会根据数据存储请求进行对目标数据表插入操作。若插入操作发生错误,例如,由于操作超时、主键重复、目标数据表锁定的各类情况,数据库将向接入装置反馈错误提示作为更新结果。接入装置在接收到错误提示后,会将目标数据表的插入标识更新为失败状态,从而下一次插入数据时,触发获取最大主键值作为第一主键值的过程,保证主键的连续性和唯一性。插入标识的默认状态为成功状态,因此,在插入成功时,可以不对插入标识进行修改。

在本实施例中,提供了一种对于数据库的插入标识的更新方式,通过数据库反馈的插入操作的成功结果来更新数据库的插入标识,有利于在插入过程出错时,在下一次进行插入时及时进行故障对应,提升方案的可操作性。

在本申请的一个实施例中,上述步骤S204,根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表,可以包括:

在数据库接入层中根据所述表标识、所述待插入主键值和所述待添加数据生成数据插入请求;

向数据库发送所述数据插入请求;

其中,所述数据库接入层包括第一接入节点和第二接入节点,所述第一接入节点的步长值与所述第二接入节点的步长值相同,所述第一接入节点的模值与所述第二接入节点的模值不同。

具体地,在本实施例中,服务器具体可以是包括多个设备的分布式系统。分布式系统中包括数据库接入层和数据库层,数据库接入层可以包括多个接入节点,而数据库层侧包括多个数据库。分布式系统在数据库接入层中根据表标识、待插入主键值和待添加数据生成数据插入请求。数据插入请求中包括用于数据库执行的数据插入指令。该数据插入指令可以采用数据库语言来编写。数据库接入层向目标数据库发送所述数据插入请求。数据库接入层的所有接入节点之间共享步长值,但是模值必须不同。可以理解的是,由于取模运算的特性,步长值的取值通常取决于所采用的接入节点的数量,即当步长值为10时,则最多可以支持10台接入设备,其模值分别为0到9。

为了便于介绍,请参阅图5,图5为本申请实施例中生成主键值的结构示意图。如图5所示,整个分布式数据库系统中包括4个接入装置。每个接入装置均可以独立地接收终端设备的数据存储指令,并且各个接入装置的步长都是一样的,而模值各不相同。例如,在步长是4的情况下,4个接入装置各自分别生成模值为0、1、2和3的主键值序列,并且序列随着时间的顺序增长。以模值为1的接入装置为例,在收到客户端的数据存储指令时,其从数据库获取最近一次插入的主键值,假定为9。然后,根据9计算下一个主键值为13,然后,对数据存储指令中的数据库语句进行改写,将主键值加入到语句中,再将语句发送给局部数据库来执行。由上述过程可以看出,在各个接入装置之间保持步长相同而模数不同,使得任意的两个接入装置所生成的主键值不会发生重复。

在本申请的实施例中,多台接入设备之间不必进行通信既可以在相互之间保证所生成的主键值在真个分布式系统中的唯一性,从而能够降低系统通信开销,提升运行效率。

在本申请的一个实施例中,终端设备可以采用多线程的方式来与服务器进行通信。上述步骤S203,根据所述第一主键值、所述步长值和所述模值,生成待插入主键值,可以包括:

针对所述第一主键值进行加锁操作;

根据所述第一主键值和所述步长值,计算中间值;

将所述中间值与所述模值的和确定为待插入主键值;

针对所述第一主键值进行解锁操作。

在本实施例中,应用层的客户端采用多线程来运行,从而可能出现单个接入装置被多个线程同时请求插入数据的情况,或者单个线程同时申请多次数据存储的情况。为了避免主键生成过程的冲突,因此可以在进行主键计算时,对计算过程的相关数据进行添加线程互斥锁操作来进行线程同步。在进行加锁操作后,再开始计算和更新待插入主键值。

具体地,待插入主键值的生成可以采用如下公式:

其中,K为第一主键值,S为步长值,M为模值。在计算时,首先计算(K+S-1)/S的商作为中间值。然后,将中间值向下取整为整数,然后再结合步长和模值计算待查中间值。举例说明,假定步长值为S为7,模值M为2,获取到的第一主键值为9,则中间值=(10+4-1)/4=3.25,向下取整为3,再带入公式计算得到待插入主键值为14。

可以理解的是,在采用线程锁的主键值生成整体过程中,可以在所有涉及更新待插入主键值时进行线程锁控制。请参阅图6,图6为本申请实施例中采用线程锁的主键值生成过程的流程图。如图6所示,生成主键值的细节步骤与上述实施例中的步骤相同,此处不再赘述。在流程开始,首先会对用于获取第一主键值的主键变量添加互斥锁,随后,从对应的局部数据库获取数据表中最近一次插入的主键值,并且对主键变量进行赋值。在获取到主键值后,可以对第一主键值的主键变量解锁。随后,在接入装置准备进行主键值计算之前,再对主键变量进行加锁,然后根据上述实施例描述的方式计算新主键值,并且将主键变量更新为计算得到的新主键值。完成后再次对主键变量解锁。在后续的过程中,当用户指定的主键值为合法主键而需要再次更新主键变量时,对主键变量进行加锁,并且按照规则根据用户指定的主键值对主键变量进行更新,随后对主键变量进行结果。可以理解的是,在本实施例中,仅在需要对主键变量进行更新的阶段才添加互斥锁进行同步控制。在每次加锁之前以及每次解锁之后,还穿插了计算数据分片、信息校验、状态填充等各类数据操作。

在本申请的实施例中,通过添加线程锁的方式来进行多线程之间的访问控制,从而能够避免多线程访问造成数据冲突,提升系统的稳定性。

在本申请的一个实施例中,在一个数据插入指令中包括多条待添加数据。上述步骤S203,根据所述第一主键值、所述步长值和所述模值,生成待插入主键值,可以包括如下步骤:

根据所述第一主键值、所述步长值和所述模值,计算第一更新主键值;

根据所述第一更新主键值、所述数据插入指令中所述待添加数据的数量和所述步长值,计算对应于所述多个待添加数据的待插入主键值序列。

本实施例提供了一种批量生成多个待插入主键值的方式。具体地,首先,根据第一主键值、步长值和模值,计算第一更新主键值,具体计算过程与上述实施例中描述的过程相同。计算得到的第一更新主键值可以理解为多个待添加数据中第一个数据的主键值。在后续的数据表插入过程中,一个数据插入指令中的多条待添加数据将会在一次插入操作中被一起插入数据表中,它们主键值可以是线性的。以此,在计算得到对应于第一个待添加数据的第一更新主键值后,可以根据待添加数据的数量和步长值来直接计算待插入主键值序列。例如,计算得到的第一更新主键值为10,并且步长为3,若待添加数据的数量为4,则待插入主键值序列为10,10+3=13,13+3=16,16+3=19。

在本申请的实施例中,批量计算多个待添加数据的多个待插入主键值,从而能够允许在一次插入操作中向数据表插入多条数据,从而降低系统处理数据添加的开销,提升数据存储的效率。

应当注意,尽管在附图中以特定顺序描述了本申请中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。

以下介绍本申请的装置实施,可以用于执行本申请上述实施例中的数据存储的方法。图7示意性地示出了本申请实施例中数据存储装置的组成框图。如图7所示,数据存储装置300主要可以包括:

指令获取模块310,用于获取数据插入指令,其中,所述数据插入指令包括目标数据库中目标数据表的表标识以及待添加数据;

主键获取模块320,用于获取所述目标数据库中上一次插入的数据所对应的第一主键值,以及获取所述目标数据表对应的步长值和模值,其中,所述步长值用于指示主键值的递增量,所述模值用于指示主键值与所述步长值的余数;

主键生成模块330,用于根据所述第一主键值、所述步长值和所述模值,生成待插入主键值;

数据插入模块340,用于根据所述表标识将所述待插入主键值和所述待添加数据插入所述目标数据表。

在本申请的一些实施例中,基于以上技术方案,数据存储装置300还包括:

主键值计算模,用于若所述待插入主键值小于所述用户指定主键,则根据所述用户指定主键、所述步长值和所述模值,计算第二主键值;

主键值更新模块,用于根据所述第二主键值和所述待添加数据的数量,更新所述待插入主键值。

在本申请的一些实施例中,基于以上技术方案,主键获取模块320,包括:

标识获取单元,用于根据所述表标识,获取所述目标数据库的插入标识以及目标数据库中最近一次插入操作所对应的待处理主键值,所述插入标识用于指示对于所述目标数据库的最近一次更新操作成功或失败;

最大值获取单元,用于若所述插入标识指示最近一次更新操作失败或者所述待处理主键值为零,则获取所述目标数据表中所有主键值中的最大值作为第一主键值;

主键值确定单元,用于若所述插入标识指示最近一次更新操作成功或者所述待处理主键值大于零,则将所述待处理主键值确定为所述第一主键值。

在本申请的一些实施例中,基于以上技术方案,数据存储装置300还包括:

响应接收模块,用于接收对所述目标数据表的插入操作的插入响应信息;

标识更新模块,用于若所述插入响应信息指示对于所述目标数据表的插入操作失败,则更新所述目标数据库的插入标识。

在本申请的一些实施例中,基于以上技术方案,数据插入模块340,包括:

请求生成单元,用于在数据库接入层中根据所述表标识、所述待插入主键值和所述待添加数据生成数据插入请求;

请求发送单元,用于向所述目标数据库发送所述数据插入请求;

其中,所述数据库接入层包括第一接入节点和第二接入节点,所述第一接入节点的步长值与所述第二接入节点的步长值相同,所述第一接入节点的模值与所述第二接入节点的模值不同。

在本申请的一些实施例中,基于以上技术方案,主键生成模块330,包括:

加锁单元,用于针对所述第一主键值进行加锁操作;

中间值计算单元,用于根据所述第一主键值和所述步长值,计算中间值;

主键确定单元,用于将所述中间值与所述模值的和确定为待插入主键值;

解锁单元,用于针对所述第一主键值进行解锁操作。

在本申请的一些实施例中,基于以上技术方案,主键生成模块330,包括:

更新主键计算单元,用于根据所述第一主键值、所述步长值和所述模值,计算第一更新主键值;

序列计算单元,用于根据所述第一更新主键值、所述数据插入指令中所述待添加数据的数量和所述步长值,计算对应于所述多个待添加数据的待插入主键值序列。

需要说明的是,上述实施例所提供的装置与上述实施例所提供的方法属于同一构思,其中各个模块执行操作的具体方式已经在方法实施例中进行了详细描述,此处不再赘述。

图8示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。

需要说明的是,图8示出的电子设备的计算机系统400仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。

如图8所示,计算机系统400包括中央处理单元(Central Processing Unit,CPU)401,其可以根据存储在只读存储器(Read-Only Memory,ROM)402中的程序或者从储存部分408加载到随机访问存储器(Random Access Memory,RAM)403中的程序而执行各种适当的动作和处理。在RAM 403中,还存储有系统操作所需的各种程序和数据。CPU 401、ROM 402以及RAM 403通过总线404彼此相连。输入/输出(Input/Output,I/O)接口405也连接至总线404。

以下部件连接至I/O接口405:包括键盘、鼠标等的输入部分406;包括诸如阴极射线管(Cathode Ray Tube,CRT)、液晶显示器(Liquid Crystal Display,LCD)等以及扬声器等的输出部分407;包括硬盘等的储存部分408;以及包括诸如LAN(Local Area Network,局域网)卡、调制解调器等的网络接口卡的通信部分409。通信部分409经由诸如因特网的网络执行通信处理。驱动器410也根据需要连接至I/O接口405。可拆卸介质411,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器410上,以便于从其上读出的计算机程序根据需要被安装入储存部分408。

特别地,根据本申请的实施例,各个方法流程图中所描述的过程可以被实现为计算机软件程序。例如,本申请的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分409从网络上被下载和安装,和/或从可拆卸介质411被安装。在该计算机程序被中央处理单元(CPU)401执行时,执行本申请的系统中限定的各种功能。

需要说明的是,本申请实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存、光纤、便携式紧凑磁盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。

通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本申请实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本申请实施方式的方法。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。

相关技术
  • 数据存储系统、数据存储方法、可读介质和电子设备
  • 数据存储方法和装置、数据查询方法和装置、数据结构、电子设备及计算机可读存储介质
技术分类

06120113066778