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