本申請(qǐng)涉及信息技術(shù)領(lǐng)域,尤其涉及一種分庫(kù)分表的輪詢?cè)L問(wèn)方法及裝置。
背景技術(shù):
隨著信息化社會(huì)的發(fā)展,人們?cè)絹?lái)越習(xí)慣于使用網(wǎng)絡(luò)來(lái)進(jìn)行業(yè)務(wù),使得通過(guò)網(wǎng)絡(luò)進(jìn)行的業(yè)務(wù)的數(shù)量在不斷增加,而將大量數(shù)據(jù)保存在一個(gè)數(shù)據(jù)庫(kù)或者數(shù)據(jù)表中的方法,會(huì)使數(shù)據(jù)庫(kù)的運(yùn)行效率大大降低,所以人們開始采用分庫(kù)分表技術(shù),即,將數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)表根據(jù)預(yù)設(shè)的規(guī)則拆分為多個(gè)數(shù)據(jù)庫(kù)中的多個(gè)分表,已解決單一數(shù)據(jù)庫(kù)、數(shù)據(jù)表的性能瓶頸問(wèn)題。
但是,由于在實(shí)際應(yīng)用時(shí),存在需要線程周期性在分庫(kù)分表中撈取數(shù)據(jù)的情況,這就需要通過(guò)線程輪詢的訪問(wèn)所有的分庫(kù)分表,而為了保證多個(gè)線程同時(shí)訪問(wèn)分庫(kù)分表時(shí),同一數(shù)據(jù)不會(huì)被多個(gè)線程同時(shí)訪問(wèn),現(xiàn)有技術(shù)采用了三種不同的技術(shù)方法。
其一,采用單個(gè)線程調(diào)用分庫(kù)分表中的數(shù)據(jù),即,通過(guò)一個(gè)線程輪詢所有分庫(kù)分表。
其二,建立多個(gè)線程與各分表之間的映射關(guān)系,使得針對(duì)每一個(gè)分表中的數(shù)據(jù)只能由與該分表具有映射關(guān)系的線程訪問(wèn)。
其三,通過(guò)對(duì)分庫(kù)分表中的數(shù)據(jù)添加線程標(biāo)識(shí)的方法,使得一個(gè)數(shù)據(jù)在被某個(gè)線程插入分庫(kù)分表后,該數(shù)據(jù)后續(xù)僅可被該線程訪問(wèn)。
雖然上述現(xiàn)有技術(shù)均可以保證分庫(kù)分表中的數(shù)據(jù)安全,但是第一種方法,由于使用單線程導(dǎo)致業(yè)務(wù)執(zhí)行效率降低,第二種方法,由于需要建立映射關(guān)系,導(dǎo)致線程或者分庫(kù)分表變更時(shí),需要重新建立該映射關(guān)系,導(dǎo)致整體不易擴(kuò)容,靈活度低,第三種方法,由于對(duì)數(shù)據(jù)進(jìn)行標(biāo)記后,其他線程便無(wú)法訪問(wèn)該數(shù)據(jù), 所以當(dāng)數(shù)據(jù)庫(kù)中的線程出現(xiàn)變更后,會(huì)出現(xiàn)數(shù)據(jù)無(wú)法讀取的情況,所以還需要對(duì)數(shù)據(jù)進(jìn)行訂正,增大了分庫(kù)分表的維護(hù)壓力。
可見(jiàn),現(xiàn)有技術(shù)中,存在分庫(kù)分表業(yè)務(wù)執(zhí)行效率低、操作不靈活、維護(hù)成本高等問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)實(shí)施例提供一種分庫(kù)分表的輪詢?cè)L問(wèn)方法及裝置,用以解決現(xiàn)有技術(shù)中分庫(kù)分表的訪問(wèn)效率低,導(dǎo)致業(yè)務(wù)執(zhí)行效率低的問(wèn)題。
本申請(qǐng)實(shí)施例提供的一種分庫(kù)分表的輪詢?cè)L問(wèn)方法,包括:
接收線程的輪詢?cè)L問(wèn)請(qǐng)求;
確定所述線程的游標(biāo),其中所述線程的游標(biāo)是全局唯一的;
根據(jù)所述游標(biāo),確定與所述游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí);
將所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)發(fā)送給所述線程,使所述線程根據(jù)所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表;
更新所述線程的游標(biāo),根據(jù)所述更新的游標(biāo),重新確定分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)并返回給所述線程,使所述線程根據(jù)重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表,直至所述線程訪問(wèn)了所有的分庫(kù)分表。
本申請(qǐng)實(shí)施例提供的一種分庫(kù)分表的輪詢?cè)L問(wèn)裝置,包括:
接收模塊,用于接收線程的輪詢?cè)L問(wèn)請(qǐng)求;
游標(biāo)確定模塊,用于確定所述線程的游標(biāo),其中所述線程的游標(biāo)是全局唯一的;
定位模塊,用于根據(jù)所述游標(biāo),確定與所述游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí);
發(fā)送模塊,用于將所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)發(fā)送給所述線程,使所述線程根據(jù)所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表;
更新模塊,用于更新所述線程的游標(biāo),使所述定位模塊根據(jù)所述更新的游 標(biāo),重新確定分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),使所述發(fā)送模塊將所述重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)返回給所述線程,使所述線程根據(jù)重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表,直至所述線程訪問(wèn)了所有的分庫(kù)分表。
本申請(qǐng)實(shí)施例提供一種分庫(kù)分表的輪詢?cè)L問(wèn)方法及裝置,該方法中,對(duì)需要輪詢?cè)L問(wèn)分庫(kù)分表的線程,先確定該線程的游標(biāo),并且該游標(biāo)是全局唯一的,之后再根據(jù)該游標(biāo)確定相應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),并將該分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)返回給該線程,使該線程訪問(wèn)相應(yīng)的分庫(kù)分表。并且,由于該線程需要輪詢分庫(kù)及分表,所以本申請(qǐng)還可更新該線程的游標(biāo),并采用同樣的方法向該線程返回新的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),如此反復(fù)更新直到該線程訪問(wèn)了所有的分庫(kù)分表。通過(guò)上述方法,在保證同一數(shù)據(jù)不會(huì)被多個(gè)線程讀取的條件下,也能滿足多個(gè)線程訪問(wèn)分庫(kù)分表,并且不論是變更線程還是變更數(shù)據(jù)庫(kù),均無(wú)需大量復(fù)雜的操作即可,使得分表分庫(kù)的運(yùn)行效率增加,提高了業(yè)務(wù)執(zhí)行效率。
附圖說(shuō)明
此處所說(shuō)明的附圖用來(lái)提供對(duì)本申請(qǐng)的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本申請(qǐng)的示意性實(shí)施例及其說(shuō)明用于解釋本申請(qǐng),并不構(gòu)成對(duì)本申請(qǐng)的不當(dāng)限定。在附圖中:
圖1為本申請(qǐng)實(shí)施例提供的分庫(kù)分表的輪詢?cè)L問(wèn)過(guò)程;
圖2為本申請(qǐng)實(shí)施例提供的分庫(kù)分表結(jié)構(gòu)示意圖;
圖3為本申請(qǐng)實(shí)施例提供的一種分庫(kù)分表的輪詢?cè)L問(wèn)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
在本申請(qǐng)實(shí)施例中,對(duì)需要輪詢?cè)L問(wèn)分庫(kù)分表的線程,先確定該線程當(dāng)前全局唯一的游標(biāo),再根據(jù)該游標(biāo)確定相應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),最后將該分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)返回給該線程,使得該線程根據(jù)該分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)訪問(wèn)對(duì)應(yīng)的分庫(kù)分表。并且在該線程輪詢?cè)L問(wèn)分庫(kù)分表時(shí),更新該線程的游標(biāo),通 過(guò)同樣的方法重新確定該線程需要訪問(wèn)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),最終使得該線程輪詢?cè)L問(wèn)玩所有的分庫(kù)分表??梢?jiàn)本申請(qǐng)所述的方法,在保證分庫(kù)分表中數(shù)據(jù)安全的前提下,并不建立線程與分庫(kù)分表之間固定的映射關(guān)系,而是使線程在每次訪問(wèn)時(shí),均可得到不同的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),使得訪問(wèn)分庫(kù)分表效率提高,分庫(kù)分表的變更更加靈活、維護(hù)難度低。
為使本申請(qǐng)的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請(qǐng)具體實(shí)施例及相應(yīng)的附圖對(duì)本申請(qǐng)技術(shù)方案進(jìn)行清楚、完整地描述。顯然,所描述的實(shí)施例僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例。基于本申請(qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本申請(qǐng)保護(hù)的范圍。
圖1為本申請(qǐng)實(shí)施例提供的分庫(kù)分表的輪詢?cè)L問(wèn)過(guò)程,具體包括以下步驟:
s101:接收線程的輪詢?cè)L問(wèn)請(qǐng)求。
在本申請(qǐng)實(shí)施例中,由于線程在訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)時(shí)需要先向該數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)庫(kù)管理系統(tǒng)發(fā)送訪問(wèn)請(qǐng)求,所以該數(shù)據(jù)庫(kù)管理系統(tǒng)需要先接收線程的輪詢?cè)L問(wèn)分庫(kù)分表的請(qǐng)求,具體可以是該數(shù)據(jù)庫(kù)管理系統(tǒng)中專門用于接收線程訪問(wèn)請(qǐng)求的軟件或應(yīng)用接收線程的輪詢?cè)L問(wèn)請(qǐng)求,并執(zhí)行下述的步驟s102~s105。
另外,需要說(shuō)明的是,該數(shù)據(jù)庫(kù)系統(tǒng)中的每個(gè)分庫(kù)中的分表數(shù)量相等,即,各分庫(kù)均具有同樣數(shù)量的分表。
s102:確定所述線程的游標(biāo)。
在本申請(qǐng)實(shí)施例中,當(dāng)接收到線程的輪詢?cè)L問(wèn)請(qǐng)求后,便可以針對(duì)該線程,確定該線程的游標(biāo)。并且,為了保證不同的線程訪問(wèn)不同的分庫(kù)分表,所以該游標(biāo)是全局唯一的,即,多個(gè)線程同時(shí)向該數(shù)據(jù)庫(kù)管理系統(tǒng)發(fā)出輪詢?cè)L問(wèn)請(qǐng)求時(shí),確定的每一個(gè)線程的游標(biāo)均是不同的。
例如,假設(shè)數(shù)據(jù)庫(kù)管理系統(tǒng)a順序接收到了三個(gè)線程發(fā)出的輪詢?cè)L問(wèn)請(qǐng)求,其中,該三個(gè)線程分別線程α、線程β和線程γ。假設(shè)此時(shí)該數(shù)據(jù)庫(kù)管理系統(tǒng)a確定該線程α的游標(biāo)為1,且該線程β和線程γ的游標(biāo)分別為2和3。
s103:根據(jù)所述游標(biāo),確定與所述游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)。
在本申請(qǐng)實(shí)施例中,當(dāng)確定了線程的游標(biāo)后,便可以根據(jù)該線程的游標(biāo),確定與該游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),其中,由于該線程的標(biāo)識(shí)是全局唯一的所以與該游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)也是全局唯一的,從而可保證同一個(gè)分表在同一時(shí)刻只被一個(gè)線程訪問(wèn)。
具體的,在該數(shù)據(jù)庫(kù)管理系統(tǒng)確定分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)之前,該數(shù)據(jù)庫(kù)管理系統(tǒng)需要先確定該數(shù)據(jù)庫(kù)系統(tǒng)中的分庫(kù)數(shù)量,以及每個(gè)分庫(kù)中的分表數(shù)量(其中,各分庫(kù)中分表的數(shù)量是相同的)。
當(dāng)確定該游標(biāo)的分庫(kù)標(biāo)識(shí)時(shí),該數(shù)據(jù)庫(kù)管理系統(tǒng)a先確定該游標(biāo)與所述分表數(shù)量的商,再確定該商的下取整值,最后確定該下取整值對(duì)分庫(kù)數(shù)量取模的值,作為與該游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)。即,可以通過(guò)庫(kù)定位公式(x-1)/n%m確定該游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí),其中,x為該線程的游標(biāo)的數(shù)值、n為該數(shù)據(jù)庫(kù)系統(tǒng)中各分庫(kù)中分表的數(shù)量、m為該書庫(kù)系統(tǒng)中分庫(kù)的數(shù)量。
當(dāng)確定該由標(biāo)的分表標(biāo)識(shí)時(shí),先確定該游標(biāo)對(duì)該分表數(shù)量取模的值,作為與該游標(biāo)相對(duì)應(yīng)的分表標(biāo)識(shí)。即,可以通過(guò)表定位公式(x-1)%n確定,其中,x和n與該庫(kù)定位公式中的x和n代表的意義相同。
繼續(xù)沿用上例,假設(shè)該數(shù)據(jù)庫(kù)系統(tǒng)中各分庫(kù)標(biāo)識(shí)分別為庫(kù)0、庫(kù)1、庫(kù)2、庫(kù)3、庫(kù)4,各分庫(kù)中分表的標(biāo)識(shí)為表0~表9,具體如圖2所示。
圖2為本申請(qǐng)實(shí)施例里提供的分庫(kù)分表結(jié)構(gòu)示意圖。通過(guò)圖2可知,該數(shù)據(jù)庫(kù)系統(tǒng)中存在5個(gè)分庫(kù),且每個(gè)分庫(kù)中均有10個(gè)分表,則可以確定n=10、m=5。
則,針對(duì)線程α,由于該線程α的標(biāo)識(shí)為1,所以可以通過(guò)庫(kù)定位公式(x-1)/10%5確定,該游標(biāo)1相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)為:0,通過(guò)表定位公式(x-1)%10,該游標(biāo)1相對(duì)應(yīng)的分表標(biāo)識(shí)為:0。于是,可以通過(guò)庫(kù)定公式及表定位公式確定該游標(biāo)1相對(duì)應(yīng)的分庫(kù)分表標(biāo)識(shí)為0和0,即分庫(kù)0和分表0。
同理,可以確定游標(biāo)2和3相對(duì)應(yīng)的分庫(kù)分表分別為,分庫(kù)0分表1和分 庫(kù)0分表2。
s104:將所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)發(fā)送給所述線程,使所述線程根據(jù)所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表。
在本申請(qǐng)實(shí)施例中,該數(shù)據(jù)庫(kù)管理系統(tǒng)在確定了該游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)后,便可以將該分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)發(fā)送給該線程,使該線程可以根據(jù)該分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表。
繼續(xù)沿用上例,由于游標(biāo)1、游標(biāo)2和游標(biāo)3相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)即分表標(biāo)識(shí)分別為:(0,0)、(0,1)和(0,2),所以向該線程α、線程β和線程γ分別返回分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)為:分庫(kù)0分表0、分庫(kù)0分表1和分庫(kù)0分表2。使該線程α、線程β和線程γ分別訪問(wèn)該數(shù)據(jù)庫(kù)系統(tǒng)中分庫(kù)的0分表0、分庫(kù)的0分表1和分庫(kù)0的分表2。
s105:更新所述線程的游標(biāo),并返回步驟s102。
也即,更新該線程的游標(biāo)后,根據(jù)所述更新的游標(biāo),重新確定分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)并返回給所述線程,使所述線程根據(jù)重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表,直至所述線程訪問(wèn)了所有的分庫(kù)分表。
在本申請(qǐng)實(shí)施例中,由于線程每一次訪問(wèn)分庫(kù)分表時(shí),僅僅訪問(wèn)了一個(gè)分表,所以該線程在訪問(wèn)完該分表后,可更新線程的游標(biāo),以訪問(wèn)其他的分表,即輪詢?cè)L問(wèn)所有的分庫(kù)分表,所以此時(shí)該數(shù)據(jù)庫(kù)管理系統(tǒng)還可以更新該線程的游標(biāo),并根據(jù)更新后的游標(biāo),通過(guò)如步驟s102~步驟s104的過(guò)程,再次使線程訪問(wèn)相應(yīng)的分庫(kù)分表。
具體的,該數(shù)據(jù)庫(kù)管理系統(tǒng)可根據(jù)自增序列算法或者哈希算法,更新該線程的游標(biāo)。并且,該游標(biāo)的取值范圍可以是為1~k之間的整數(shù)(其中,k為正整數(shù)),而該數(shù)值k為大于分庫(kù)數(shù)量與每個(gè)分庫(kù)中的分表數(shù)量之積的正整數(shù)。
其中,當(dāng)該數(shù)據(jù)庫(kù)管理系統(tǒng)采用自增序列算法更新線程的游標(biāo)時(shí),數(shù)據(jù)庫(kù)管理系統(tǒng)可針對(duì)一個(gè)線程,根據(jù)上一次確定的該線程的游標(biāo)的數(shù)值,在上一次游標(biāo)數(shù)值的基礎(chǔ)上增加預(yù)設(shè)的數(shù)值(如,1),作為當(dāng)前該線程的游標(biāo)的數(shù)值。 而當(dāng)確定的由標(biāo)的超過(guò)游標(biāo)的取值范圍時(shí),則自動(dòng)從1開始沖洗確定該線程的游標(biāo),即該數(shù)據(jù)庫(kù)管理系統(tǒng)確定的游標(biāo)在1~k之間輪詢。
在本申請(qǐng)中,當(dāng)該數(shù)據(jù)庫(kù)管理系統(tǒng)采用哈希算法更新線程的游標(biāo)時(shí),由于該游標(biāo)的取值范圍為1~k,所以每一次該數(shù)據(jù)庫(kù)管理系統(tǒng)取得的都是1~k之間的隨機(jī)數(shù),同時(shí)可以保證同一時(shí)間多個(gè)線程取得游標(biāo)均是全局唯一的。
需要說(shuō)明的是,采用自增序列算法時(shí),可以保證各個(gè)線程順序的輪詢各分庫(kù)分表,但是由于此時(shí)各線程確定的游標(biāo)均是順序的,即從數(shù)值上看是相鄰的數(shù)值,所以在該數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行期間各線程均訪問(wèn)分庫(kù)分表均相對(duì)集中,可能導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)在運(yùn)行時(shí)壓力集中在某些分庫(kù)分表,而剩余的分庫(kù)分表的壓力很小。在采用哈希算法時(shí),則可以保證從運(yùn)行初期開始各線程所訪問(wèn)的分庫(kù)分表就是分散的,有利于分散數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行壓力。當(dāng)然,在采用自增序列算法時(shí),還可以根據(jù)具體的數(shù)據(jù)庫(kù)系統(tǒng)中分庫(kù)分表的結(jié)構(gòu),對(duì)該自增序列算法進(jìn)行優(yōu)化,使得各線程更新的游標(biāo)并不是順序的,即從數(shù)值上看并不是相鄰的數(shù)值,從而達(dá)到使各線程確定的游標(biāo)分散的目的,以分散該數(shù)據(jù)庫(kù)系統(tǒng)在運(yùn)行時(shí)的壓力。具體的,可以使各線程確定的游標(biāo)在增加數(shù)值時(shí),增加除1以外的正整數(shù),使各游標(biāo)在數(shù)值上是分散的不相鄰的,進(jìn)而使得在后續(xù)步驟中各線程確定的分庫(kù)分表是分散的(如,該自增序列算法在計(jì)算各游標(biāo)時(shí)的數(shù)值增量為各分庫(kù)中分表的數(shù)量n,那么通過(guò)該自增序列算法得到的游標(biāo)即為1、n+1、2n+1等等,使得各線程根據(jù)該游標(biāo)確定的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)也是分散的,分散了該數(shù)據(jù)庫(kù)系統(tǒng)在運(yùn)行時(shí)的壓力)。
另外,除了自增序列算法以及哈希算法以外,本申請(qǐng)還可以采用其他算法,如,具有訓(xùn)練功能的算法,使得各線程的訪問(wèn)效率更高,具體還可使用何種算法本申請(qǐng)并不做具體限定。
繼續(xù)沿用上例,假設(shè)該數(shù)據(jù)庫(kù)管理系統(tǒng)采用自增序列算法更各線程的游標(biāo),則,當(dāng)更新該線程α、線程β和線程γ的游標(biāo)時(shí),首先該數(shù)據(jù)庫(kù)管理系統(tǒng)根據(jù)上一次確定的該線程α、線程β和線程γ的游標(biāo),即,1、2和3,確定當(dāng)前線 程α、線程β和線程γ的游標(biāo)分別為4、5和6。并且,由于該數(shù)據(jù)庫(kù)系統(tǒng)中存在5個(gè)分庫(kù),并且每個(gè)分庫(kù)中均存在10個(gè)分表,所以該游標(biāo)的取值范圍應(yīng)為1至大于50的正整數(shù),即,k應(yīng)大于50,則當(dāng)前確定的該線程α、線程β和線程γ的游標(biāo)在該游標(biāo)的取值范圍內(nèi)。
其次,該數(shù)據(jù)庫(kù)管理系統(tǒng)還需要根據(jù)庫(kù)定位公式(x-1)/n%m以及表定位公式(x-1)%n,重新確定該線程α、線程β和線程γ的游標(biāo)相應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)。于是,該數(shù)據(jù)管理系統(tǒng)可以確定游標(biāo)4、5和6相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)分別為:(0,3)、(0,4)和(0,5)。
最后,該數(shù)據(jù)庫(kù)管理系統(tǒng)將各游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),發(fā)送給該線程α、線程β和線程γ,使該線程α、線程β和線程γ訪問(wèn)相應(yīng)得分表分庫(kù),直至該線程α、線程β和線程γ輪詢?cè)L問(wèn)完該數(shù)據(jù)庫(kù)系統(tǒng)的所有分庫(kù)分表。
另外,當(dāng)?shù)谌胃略摼€程α、線程β和線程γ的游標(biāo)時(shí),該線程α、線程β和線程γ的游標(biāo)則分別為:10、11、12。則,此時(shí),該線程α的游標(biāo)為10,通過(guò)庫(kù)定位公式以及表定位公式可以確定,該游標(biāo)10相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)為(0,9),該線程β的游標(biāo)為11,該游標(biāo)11相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)為(1,0)。
即,只有當(dāng)游標(biāo)從1增加至11時(shí),該庫(kù)定位公式的數(shù)值才會(huì)增加1(如,確定的分庫(kù)標(biāo)識(shí)從分庫(kù)0變更至分庫(kù)1)。也就是說(shuō),游標(biāo)1~游標(biāo)10所定位到的分庫(kù)均是分庫(kù)0,游標(biāo)11~游標(biāo)21鎖定為到的分庫(kù)均為分庫(kù)1,依次類推。并且,在該游標(biāo)由1增至10的過(guò)程中,該表定位公式確定的分表標(biāo)識(shí)順序?yàn)?~9,而當(dāng)該游標(biāo)增至11時(shí),該表定位公式確定的分表標(biāo)識(shí)又輪詢回0。所以,通過(guò)上述庫(kù)定位公式以及表定位公式的結(jié)合,不同的游標(biāo)均可以確定不同的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),并且可以保證當(dāng)游標(biāo)在其取值范圍內(nèi)遍歷后,該表定位公式以及庫(kù)定位公式也確定了所有的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)。
通過(guò)上述方法,先對(duì)需要輪詢?cè)L問(wèn)分庫(kù)分表的線程,確定該線程當(dāng)前全局唯一的游標(biāo),再通過(guò)庫(kù)定位公式以及表定位公式確定該游標(biāo)相應(yīng)的分庫(kù)標(biāo)識(shí)以 及分表標(biāo)識(shí),之后通過(guò)發(fā)送給該線程的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),使該線程確定當(dāng)前訪問(wèn)的分庫(kù)分表,并且進(jìn)一步通過(guò)更新該線程的游標(biāo),是的該線程可以重復(fù)上述過(guò)程,訪問(wèn)重新確定的分庫(kù)分表,最終達(dá)到輪詢分庫(kù)分表的目的??梢?jiàn),通過(guò)本申請(qǐng)?zhí)峁┑姆椒?,?shù)據(jù)庫(kù)管理系統(tǒng)可以高效、靈活、簡(jiǎn)單的確定多個(gè)線程需要輪詢?cè)L問(wèn)的分庫(kù)分表,并且由于各線程的游標(biāo)的全局唯一性,使得各線程訪問(wèn)的分庫(kù)分表均是不同的,進(jìn)一步當(dāng)該數(shù)據(jù)庫(kù)系統(tǒng)變成線程或者分庫(kù)分表時(shí),也無(wú)需大量改動(dòng)映射關(guān)系或者修訂數(shù)據(jù),只需保證游標(biāo)取值范圍、并修改表定位公式和庫(kù)定位公式中分庫(kù)分表數(shù)量即可。因此,通過(guò)本申請(qǐng)實(shí)施例提供的方法,可使得分表分庫(kù)的運(yùn)行效率增加,提高業(yè)務(wù)執(zhí)行效率。
另外,由于各線程是通過(guò)游標(biāo)的數(shù)值、庫(kù)定位公式和表定位公式,最終確定的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),所以在確定各線程訪問(wèn)分庫(kù)分表的規(guī)律時(shí),除了調(diào)整確定各線程的游標(biāo)時(shí)使用的算法(如,調(diào)整自增序列算法的每次增加的數(shù)值)以外,在本申請(qǐng)中,還可以通過(guò)調(diào)整庫(kù)定位公式和表定位公式的方法,改變各線程訪問(wèn)分庫(kù)分表的規(guī)律,即,各線程是順序遍歷訪問(wèn)各分庫(kù)分表還是隨機(jī)訪問(wèn)各分庫(kù)分表。并且,可以通過(guò)生成游標(biāo)所使用的算法,以及與該算法對(duì)應(yīng)的庫(kù)定位公式和表定位公式,確定不同的分庫(kù)分表訪問(wèn)規(guī)律。
具體的,當(dāng)采用自增序列算法確定順序排列的各線程的游標(biāo)時(shí),若需要優(yōu)先遍歷各分庫(kù)中的分表,則可采用如在步驟s103中所述的庫(kù)定位公式(x-1)/n%m以及表定位公式(x-1)%n,便可達(dá)到如上例所述的各線程只有訪問(wèn)完畢上一個(gè)分庫(kù)中全部分表后,才會(huì)訪問(wèn)下一個(gè)分庫(kù)中的分表的效果,即優(yōu)先遍歷各分庫(kù)中分表的效果。而若,需要優(yōu)先遍歷各分庫(kù)時(shí),則該數(shù)據(jù)庫(kù)管理系統(tǒng)在步驟s103中,可以采用庫(kù)定位公式(x-1)%m以及表定位公式(x-1)/m%n,確定該游標(biāo)對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),則在數(shù)值上相鄰的游標(biāo)確定分庫(kù)標(biāo)識(shí)不相同,即,使各線程優(yōu)先訪問(wèn)各分庫(kù),而不是集中訪問(wèn)某一個(gè)分庫(kù)中的各分表。
繼續(xù)沿用上例,假設(shè)在步驟s103中線程α、線程β和線程γ的游標(biāo)1、2 和3,采用的是庫(kù)定位公式(x-1)%m以及表定位公式(x-1)/m%n,確定各游標(biāo)對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),則經(jīng)過(guò)計(jì)算,可以確定該游標(biāo)1、2和3,對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)為(0,0)、(1,0)和(2,0)。并且,在步驟s105中,該線程α、線程β和線程γ更新游標(biāo)為游標(biāo)4、游標(biāo)5和游標(biāo)6后,該游標(biāo)4、游標(biāo)5和游標(biāo)6在經(jīng)過(guò)庫(kù)定位公式(x-1)%m以及表定位公式(x-1)/m%n的計(jì)算后,確定的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)為(3,0)、(4,0)和(0,1)。可見(jiàn),各線程只有在訪問(wèn)完該數(shù)據(jù)庫(kù)系統(tǒng)所有分庫(kù)中的分表0之后,才會(huì)訪問(wèn)各分庫(kù)中的分表1,即,各線程優(yōu)先遍歷了該數(shù)據(jù)庫(kù)中的各分庫(kù)。
并且,當(dāng)采用哈希算法確定各線程的游標(biāo)時(shí),在本申請(qǐng)中,還可以采用庫(kù)定位公式(x-1)%m以及表定位公式(x-1)%n,確定該游標(biāo)對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí),而且同樣可以達(dá)到使各線程隨機(jī)訪問(wèn)分庫(kù)分表的目的。由此可見(jiàn),在本申請(qǐng)中,可以靈活的采用不同的庫(kù)定位公式以及表定位公式,配合對(duì)應(yīng)的確定各線程游標(biāo)時(shí)的算法,可以達(dá)到不同的分庫(kù)分表訪問(wèn)規(guī)律,以滿足不同的需求。當(dāng)然,配合不同的算法,而采用何種庫(kù)定位公式以及表定位公式,本申請(qǐng)并不做具體限定。
基于圖1所示的分庫(kù)分表的輪詢?cè)L問(wèn)過(guò)程,本申請(qǐng)實(shí)施例還提供了一種分庫(kù)分表的輪詢?cè)L問(wèn)裝置,如圖3所示。
圖3是本申請(qǐng)實(shí)施例提供一種分庫(kù)分表的輪詢?cè)L問(wèn)裝置的結(jié)構(gòu)示意圖,具體包括:
接收模塊301,用于接收線程的輪詢?cè)L問(wèn)請(qǐng)求;
游標(biāo)確定模塊302,用于確定所述線程的游標(biāo),其中所述線程的游標(biāo)是全局唯一的;
定位模塊303,用于根據(jù)所述游標(biāo),確定與所述游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí);
發(fā)送模塊304,用于將所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)發(fā)送給所述線程,使所述線程根據(jù)所述分庫(kù)標(biāo)識(shí)以及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表;
更新模塊305,用于更新所述線程的游標(biāo),使所述定位模塊303根據(jù)所述更新的游標(biāo),重新確定分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí),使所述發(fā)送模塊304將所述重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)返回給所述線程,使所述線程根據(jù)重新確定的分庫(kù)標(biāo)識(shí)及分表標(biāo)識(shí)訪問(wèn)相應(yīng)的分庫(kù)分表,直至所述線程訪問(wèn)了所有的分庫(kù)分表。
所述更新模塊305具體用于,根據(jù)自增序列算法或者哈希算法,更新所述線程的游標(biāo)。
所述游標(biāo)的取值范圍為1到k之間的整數(shù),其中,k為大于分庫(kù)數(shù)量與每個(gè)分庫(kù)中的分表數(shù)量之積的正整數(shù),每個(gè)分庫(kù)中的分表的數(shù)量相等。
所述定位模塊303具體用于,確定所述游標(biāo)與所述分表數(shù)量的商,確定所述商的下取整值,確定所述下取整值對(duì)所述分庫(kù)數(shù)量取模的值,作為與所述游標(biāo)相對(duì)應(yīng)的分庫(kù)標(biāo)識(shí)。
所述定位模塊303具體用于,確定所述游標(biāo)對(duì)所述分表數(shù)量取模的值,作為與所述游標(biāo)相對(duì)應(yīng)的分表標(biāo)識(shí)。
具體的,上述如圖3所示的分庫(kù)分表的輪詢?cè)L問(wèn)裝置可以位于數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)庫(kù)管理系統(tǒng)中。
在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。
計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來(lái)實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器 (cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問(wèn)的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。
還需要說(shuō)明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、商品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、商品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
以上所述僅為本申請(qǐng)的實(shí)施例而已,并不用于限制本申請(qǐng)。對(duì)于本領(lǐng)域技術(shù)人員來(lái)說(shuō),本申請(qǐng)可以有各種更改和變化。凡在本申請(qǐng)的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)的權(quán)利要求范圍之內(nèi)。