一种分库分表的轮询访问方法及装置与流程

文档序号:11234086阅读:266来源:国知局
一种分库分表的轮询访问方法及装置与流程

本申请涉及信息技术领域,尤其涉及一种分库分表的轮询访问方法及装置。



背景技术:

随着信息化社会的发展,人们越来越习惯于使用网络来进行业务,使得通过网络进行的业务的数量在不断增加,而将大量数据保存在一个数据库或者数据表中的方法,会使数据库的运行效率大大降低,所以人们开始采用分库分表技术,即,将数据库中的一个数据表根据预设的规则拆分为多个数据库中的多个分表,已解决单一数据库、数据表的性能瓶颈问题。

但是,由于在实际应用时,存在需要线程周期性在分库分表中捞取数据的情况,这就需要通过线程轮询的访问所有的分库分表,而为了保证多个线程同时访问分库分表时,同一数据不会被多个线程同时访问,现有技术采用了三种不同的技术方法。

其一,采用单个线程调用分库分表中的数据,即,通过一个线程轮询所有分库分表。

其二,建立多个线程与各分表之间的映射关系,使得针对每一个分表中的数据只能由与该分表具有映射关系的线程访问。

其三,通过对分库分表中的数据添加线程标识的方法,使得一个数据在被某个线程插入分库分表后,该数据后续仅可被该线程访问。

虽然上述现有技术均可以保证分库分表中的数据安全,但是第一种方法,由于使用单线程导致业务执行效率降低,第二种方法,由于需要建立映射关系,导致线程或者分库分表变更时,需要重新建立该映射关系,导致整体不易扩容,灵活度低,第三种方法,由于对数据进行标记后,其他线程便无法访问该数据, 所以当数据库中的线程出现变更后,会出现数据无法读取的情况,所以还需要对数据进行订正,增大了分库分表的维护压力。

可见,现有技术中,存在分库分表业务执行效率低、操作不灵活、维护成本高等问题。



技术实现要素:

本申请实施例提供一种分库分表的轮询访问方法及装置,用以解决现有技术中分库分表的访问效率低,导致业务执行效率低的问题。

本申请实施例提供的一种分库分表的轮询访问方法,包括:

接收线程的轮询访问请求;

确定所述线程的游标,其中所述线程的游标是全局唯一的;

根据所述游标,确定与所述游标相对应的分库标识以及分表标识;

将所述分库标识以及分表标识发送给所述线程,使所述线程根据所述分库标识以及分表标识访问相应的分库分表;

更新所述线程的游标,根据所述更新的游标,重新确定分库标识及分表标识并返回给所述线程,使所述线程根据重新确定的分库标识及分表标识访问相应的分库分表,直至所述线程访问了所有的分库分表。

本申请实施例提供的一种分库分表的轮询访问装置,包括:

接收模块,用于接收线程的轮询访问请求;

游标确定模块,用于确定所述线程的游标,其中所述线程的游标是全局唯一的;

定位模块,用于根据所述游标,确定与所述游标相对应的分库标识以及分表标识;

发送模块,用于将所述分库标识以及分表标识发送给所述线程,使所述线程根据所述分库标识以及分表标识访问相应的分库分表;

更新模块,用于更新所述线程的游标,使所述定位模块根据所述更新的游 标,重新确定分库标识及分表标识,使所述发送模块将所述重新确定的分库标识及分表标识返回给所述线程,使所述线程根据重新确定的分库标识及分表标识访问相应的分库分表,直至所述线程访问了所有的分库分表。

本申请实施例提供一种分库分表的轮询访问方法及装置,该方法中,对需要轮询访问分库分表的线程,先确定该线程的游标,并且该游标是全局唯一的,之后再根据该游标确定相应的分库标识以及分表标识,并将该分库标识及分表标识返回给该线程,使该线程访问相应的分库分表。并且,由于该线程需要轮询分库及分表,所以本申请还可更新该线程的游标,并采用同样的方法向该线程返回新的分库标识及分表标识,如此反复更新直到该线程访问了所有的分库分表。通过上述方法,在保证同一数据不会被多个线程读取的条件下,也能满足多个线程访问分库分表,并且不论是变更线程还是变更数据库,均无需大量复杂的操作即可,使得分表分库的运行效率增加,提高了业务执行效率。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本申请实施例提供的分库分表的轮询访问过程;

图2为本申请实施例提供的分库分表结构示意图;

图3为本申请实施例提供的一种分库分表的轮询访问装置的结构示意图。

具体实施方式

在本申请实施例中,对需要轮询访问分库分表的线程,先确定该线程当前全局唯一的游标,再根据该游标确定相应的分库标识及分表标识,最后将该分库标识及分表标识返回给该线程,使得该线程根据该分库标识及分表标识访问对应的分库分表。并且在该线程轮询访问分库分表时,更新该线程的游标,通 过同样的方法重新确定该线程需要访问的分库标识及分表标识,最终使得该线程轮询访问玩所有的分库分表。可见本申请所述的方法,在保证分库分表中数据安全的前提下,并不建立线程与分库分表之间固定的映射关系,而是使线程在每次访问时,均可得到不同的分库标识及分表标识,使得访问分库分表效率提高,分库分表的变更更加灵活、维护难度低。

为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

图1为本申请实施例提供的分库分表的轮询访问过程,具体包括以下步骤:

s101:接收线程的轮询访问请求。

在本申请实施例中,由于线程在访问数据库系统时需要先向该数据库系统的数据库管理系统发送访问请求,所以该数据库管理系统需要先接收线程的轮询访问分库分表的请求,具体可以是该数据库管理系统中专门用于接收线程访问请求的软件或应用接收线程的轮询访问请求,并执行下述的步骤s102~s105。

另外,需要说明的是,该数据库系统中的每个分库中的分表数量相等,即,各分库均具有同样数量的分表。

s102:确定所述线程的游标。

在本申请实施例中,当接收到线程的轮询访问请求后,便可以针对该线程,确定该线程的游标。并且,为了保证不同的线程访问不同的分库分表,所以该游标是全局唯一的,即,多个线程同时向该数据库管理系统发出轮询访问请求时,确定的每一个线程的游标均是不同的。

例如,假设数据库管理系统a顺序接收到了三个线程发出的轮询访问请求,其中,该三个线程分别线程α、线程β和线程γ。假设此时该数据库管理系统a确定该线程α的游标为1,且该线程β和线程γ的游标分别为2和3。

s103:根据所述游标,确定与所述游标相对应的分库标识以及分表标识。

在本申请实施例中,当确定了线程的游标后,便可以根据该线程的游标,确定与该游标相对应的分库标识以及分表标识,其中,由于该线程的标识是全局唯一的所以与该游标相对应的分库标识以及分表标识也是全局唯一的,从而可保证同一个分表在同一时刻只被一个线程访问。

具体的,在该数据库管理系统确定分库标识以及分表标识之前,该数据库管理系统需要先确定该数据库系统中的分库数量,以及每个分库中的分表数量(其中,各分库中分表的数量是相同的)。

当确定该游标的分库标识时,该数据库管理系统a先确定该游标与所述分表数量的商,再确定该商的下取整值,最后确定该下取整值对分库数量取模的值,作为与该游标相对应的分库标识。即,可以通过库定位公式(x-1)/n%m确定该游标相对应的分库标识,其中,x为该线程的游标的数值、n为该数据库系统中各分库中分表的数量、m为该书库系统中分库的数量。

当确定该由标的分表标识时,先确定该游标对该分表数量取模的值,作为与该游标相对应的分表标识。即,可以通过表定位公式(x-1)%n确定,其中,x和n与该库定位公式中的x和n代表的意义相同。

继续沿用上例,假设该数据库系统中各分库标识分别为库0、库1、库2、库3、库4,各分库中分表的标识为表0~表9,具体如图2所示。

图2为本申请实施例里提供的分库分表结构示意图。通过图2可知,该数据库系统中存在5个分库,且每个分库中均有10个分表,则可以确定n=10、m=5。

则,针对线程α,由于该线程α的标识为1,所以可以通过库定位公式(x-1)/10%5确定,该游标1相对应的分库标识为:0,通过表定位公式(x-1)%10,该游标1相对应的分表标识为:0。于是,可以通过库定公式及表定位公式确定该游标1相对应的分库分表标识为0和0,即分库0和分表0。

同理,可以确定游标2和3相对应的分库分表分别为,分库0分表1和分 库0分表2。

s104:将所述分库标识以及分表标识发送给所述线程,使所述线程根据所述分库标识以及分表标识访问相应的分库分表。

在本申请实施例中,该数据库管理系统在确定了该游标相对应的分库标识以及分表标识后,便可以将该分库标识以及分表标识发送给该线程,使该线程可以根据该分库标识以及分表标识访问相应的分库分表。

继续沿用上例,由于游标1、游标2和游标3相对应的分库标识即分表标识分别为:(0,0)、(0,1)和(0,2),所以向该线程α、线程β和线程γ分别返回分库标识及分表标识为:分库0分表0、分库0分表1和分库0分表2。使该线程α、线程β和线程γ分别访问该数据库系统中分库的0分表0、分库的0分表1和分库0的分表2。

s105:更新所述线程的游标,并返回步骤s102。

也即,更新该线程的游标后,根据所述更新的游标,重新确定分库标识及分表标识并返回给所述线程,使所述线程根据重新确定的分库标识及分表标识访问相应的分库分表,直至所述线程访问了所有的分库分表。

在本申请实施例中,由于线程每一次访问分库分表时,仅仅访问了一个分表,所以该线程在访问完该分表后,可更新线程的游标,以访问其他的分表,即轮询访问所有的分库分表,所以此时该数据库管理系统还可以更新该线程的游标,并根据更新后的游标,通过如步骤s102~步骤s104的过程,再次使线程访问相应的分库分表。

具体的,该数据库管理系统可根据自增序列算法或者哈希算法,更新该线程的游标。并且,该游标的取值范围可以是为1~k之间的整数(其中,k为正整数),而该数值k为大于分库数量与每个分库中的分表数量之积的正整数。

其中,当该数据库管理系统采用自增序列算法更新线程的游标时,数据库管理系统可针对一个线程,根据上一次确定的该线程的游标的数值,在上一次游标数值的基础上增加预设的数值(如,1),作为当前该线程的游标的数值。 而当确定的由标的超过游标的取值范围时,则自动从1开始冲洗确定该线程的游标,即该数据库管理系统确定的游标在1~k之间轮询。

在本申请中,当该数据库管理系统采用哈希算法更新线程的游标时,由于该游标的取值范围为1~k,所以每一次该数据库管理系统取得的都是1~k之间的随机数,同时可以保证同一时间多个线程取得游标均是全局唯一的。

需要说明的是,采用自增序列算法时,可以保证各个线程顺序的轮询各分库分表,但是由于此时各线程确定的游标均是顺序的,即从数值上看是相邻的数值,所以在该数据库系统运行期间各线程均访问分库分表均相对集中,可能导致数据库系统在运行时压力集中在某些分库分表,而剩余的分库分表的压力很小。在采用哈希算法时,则可以保证从运行初期开始各线程所访问的分库分表就是分散的,有利于分散数据库系统的运行压力。当然,在采用自增序列算法时,还可以根据具体的数据库系统中分库分表的结构,对该自增序列算法进行优化,使得各线程更新的游标并不是顺序的,即从数值上看并不是相邻的数值,从而达到使各线程确定的游标分散的目的,以分散该数据库系统在运行时的压力。具体的,可以使各线程确定的游标在增加数值时,增加除1以外的正整数,使各游标在数值上是分散的不相邻的,进而使得在后续步骤中各线程确定的分库分表是分散的(如,该自增序列算法在计算各游标时的数值增量为各分库中分表的数量n,那么通过该自增序列算法得到的游标即为1、n+1、2n+1等等,使得各线程根据该游标确定的分库标识以及分表标识也是分散的,分散了该数据库系统在运行时的压力)。

另外,除了自增序列算法以及哈希算法以外,本申请还可以采用其他算法,如,具有训练功能的算法,使得各线程的访问效率更高,具体还可使用何种算法本申请并不做具体限定。

继续沿用上例,假设该数据库管理系统采用自增序列算法更各线程的游标,则,当更新该线程α、线程β和线程γ的游标时,首先该数据库管理系统根据上一次确定的该线程α、线程β和线程γ的游标,即,1、2和3,确定当前线 程α、线程β和线程γ的游标分别为4、5和6。并且,由于该数据库系统中存在5个分库,并且每个分库中均存在10个分表,所以该游标的取值范围应为1至大于50的正整数,即,k应大于50,则当前确定的该线程α、线程β和线程γ的游标在该游标的取值范围内。

其次,该数据库管理系统还需要根据库定位公式(x-1)/n%m以及表定位公式(x-1)%n,重新确定该线程α、线程β和线程γ的游标相应的分库标识及分表标识。于是,该数据管理系统可以确定游标4、5和6相对应的分库标识及分表标识分别为:(0,3)、(0,4)和(0,5)。

最后,该数据库管理系统将各游标相对应的分库标识及分表标识,发送给该线程α、线程β和线程γ,使该线程α、线程β和线程γ访问相应得分表分库,直至该线程α、线程β和线程γ轮询访问完该数据库系统的所有分库分表。

另外,当第三次更新该线程α、线程β和线程γ的游标时,该线程α、线程β和线程γ的游标则分别为:10、11、12。则,此时,该线程α的游标为10,通过库定位公式以及表定位公式可以确定,该游标10相对应的分库标识及分表标识为(0,9),该线程β的游标为11,该游标11相对应的分库标识及分表标识为(1,0)。

即,只有当游标从1增加至11时,该库定位公式的数值才会增加1(如,确定的分库标识从分库0变更至分库1)。也就是说,游标1~游标10所定位到的分库均是分库0,游标11~游标21锁定为到的分库均为分库1,依次类推。并且,在该游标由1增至10的过程中,该表定位公式确定的分表标识顺序为0~9,而当该游标增至11时,该表定位公式确定的分表标识又轮询回0。所以,通过上述库定位公式以及表定位公式的结合,不同的游标均可以确定不同的分库标识以及分表标识,并且可以保证当游标在其取值范围内遍历后,该表定位公式以及库定位公式也确定了所有的分库标识以及分表标识。

通过上述方法,先对需要轮询访问分库分表的线程,确定该线程当前全局唯一的游标,再通过库定位公式以及表定位公式确定该游标相应的分库标识以 及分表标识,之后通过发送给该线程的分库标识以及分表标识,使该线程确定当前访问的分库分表,并且进一步通过更新该线程的游标,是的该线程可以重复上述过程,访问重新确定的分库分表,最终达到轮询分库分表的目的。可见,通过本申请提供的方法,数据库管理系统可以高效、灵活、简单的确定多个线程需要轮询访问的分库分表,并且由于各线程的游标的全局唯一性,使得各线程访问的分库分表均是不同的,进一步当该数据库系统变成线程或者分库分表时,也无需大量改动映射关系或者修订数据,只需保证游标取值范围、并修改表定位公式和库定位公式中分库分表数量即可。因此,通过本申请实施例提供的方法,可使得分表分库的运行效率增加,提高业务执行效率。

另外,由于各线程是通过游标的数值、库定位公式和表定位公式,最终确定的分库标识以及分表标识,所以在确定各线程访问分库分表的规律时,除了调整确定各线程的游标时使用的算法(如,调整自增序列算法的每次增加的数值)以外,在本申请中,还可以通过调整库定位公式和表定位公式的方法,改变各线程访问分库分表的规律,即,各线程是顺序遍历访问各分库分表还是随机访问各分库分表。并且,可以通过生成游标所使用的算法,以及与该算法对应的库定位公式和表定位公式,确定不同的分库分表访问规律。

具体的,当采用自增序列算法确定顺序排列的各线程的游标时,若需要优先遍历各分库中的分表,则可采用如在步骤s103中所述的库定位公式(x-1)/n%m以及表定位公式(x-1)%n,便可达到如上例所述的各线程只有访问完毕上一个分库中全部分表后,才会访问下一个分库中的分表的效果,即优先遍历各分库中分表的效果。而若,需要优先遍历各分库时,则该数据库管理系统在步骤s103中,可以采用库定位公式(x-1)%m以及表定位公式(x-1)/m%n,确定该游标对应的分库标识以及分表标识,则在数值上相邻的游标确定分库标识不相同,即,使各线程优先访问各分库,而不是集中访问某一个分库中的各分表。

继续沿用上例,假设在步骤s103中线程α、线程β和线程γ的游标1、2 和3,采用的是库定位公式(x-1)%m以及表定位公式(x-1)/m%n,确定各游标对应的分库标识以及分表标识,则经过计算,可以确定该游标1、2和3,对应的分库标识以及分表标识为(0,0)、(1,0)和(2,0)。并且,在步骤s105中,该线程α、线程β和线程γ更新游标为游标4、游标5和游标6后,该游标4、游标5和游标6在经过库定位公式(x-1)%m以及表定位公式(x-1)/m%n的计算后,确定的分库标识以及分表标识为(3,0)、(4,0)和(0,1)。可见,各线程只有在访问完该数据库系统所有分库中的分表0之后,才会访问各分库中的分表1,即,各线程优先遍历了该数据库中的各分库。

并且,当采用哈希算法确定各线程的游标时,在本申请中,还可以采用库定位公式(x-1)%m以及表定位公式(x-1)%n,确定该游标对应的分库标识以及分表标识,而且同样可以达到使各线程随机访问分库分表的目的。由此可见,在本申请中,可以灵活的采用不同的库定位公式以及表定位公式,配合对应的确定各线程游标时的算法,可以达到不同的分库分表访问规律,以满足不同的需求。当然,配合不同的算法,而采用何种库定位公式以及表定位公式,本申请并不做具体限定。

基于图1所示的分库分表的轮询访问过程,本申请实施例还提供了一种分库分表的轮询访问装置,如图3所示。

图3是本申请实施例提供一种分库分表的轮询访问装置的结构示意图,具体包括:

接收模块301,用于接收线程的轮询访问请求;

游标确定模块302,用于确定所述线程的游标,其中所述线程的游标是全局唯一的;

定位模块303,用于根据所述游标,确定与所述游标相对应的分库标识以及分表标识;

发送模块304,用于将所述分库标识以及分表标识发送给所述线程,使所述线程根据所述分库标识以及分表标识访问相应的分库分表;

更新模块305,用于更新所述线程的游标,使所述定位模块303根据所述更新的游标,重新确定分库标识及分表标识,使所述发送模块304将所述重新确定的分库标识及分表标识返回给所述线程,使所述线程根据重新确定的分库标识及分表标识访问相应的分库分表,直至所述线程访问了所有的分库分表。

所述更新模块305具体用于,根据自增序列算法或者哈希算法,更新所述线程的游标。

所述游标的取值范围为1到k之间的整数,其中,k为大于分库数量与每个分库中的分表数量之积的正整数,每个分库中的分表的数量相等。

所述定位模块303具体用于,确定所述游标与所述分表数量的商,确定所述商的下取整值,确定所述下取整值对所述分库数量取模的值,作为与所述游标相对应的分库标识。

所述定位模块303具体用于,确定所述游标对所述分表数量取模的值,作为与所述游标相对应的分表标识。

具体的,上述如图3所示的分库分表的轮询访问装置可以位于数据库系统的数据库管理系统中。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器 (cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1