本發(fā)明涉及計算機(jī)及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,特別是涉及一種非關(guān)系型數(shù)據(jù)庫的控制方法及裝置。
背景技術(shù):
隨著互聯(lián)網(wǎng)時代的到來,社交網(wǎng)絡(luò)、微博、位置服務(wù)等面向普通互聯(lián)網(wǎng)用戶的交互網(wǎng)站正蓬勃興起,各種網(wǎng)站向數(shù)以億計的用戶提供基于互聯(lián)網(wǎng)和無線網(wǎng)絡(luò)的交互服務(wù)。遍布全世界的互聯(lián)網(wǎng)用戶每天都進(jìn)行多種多樣的交互,隨時都在制造各種個樣的數(shù)據(jù),這些數(shù)據(jù)的數(shù)量是單機(jī)時代數(shù)據(jù)量的數(shù)倍。
面對數(shù)據(jù)的持續(xù)增長,關(guān)系型數(shù)據(jù)庫在很多方面已經(jīng)無法滿足系統(tǒng)需求,例如,關(guān)系型數(shù)據(jù)庫在高并發(fā)讀寫、海量數(shù)據(jù)高效讀寫、高可用性以及高擴(kuò)展性等方面有所欠缺。而非關(guān)系型數(shù)據(jù)庫,例如nosql、mongodb、hbase等,可以達(dá)到上述方面的要求,但是又欠缺對數(shù)據(jù)一致性的能力。
目前互聯(lián)網(wǎng)網(wǎng)站系統(tǒng)面對數(shù)據(jù)不斷增長、并發(fā)持續(xù)增高的情況,使用非關(guān)系型數(shù)據(jù)庫勢在必行,但同時又需要數(shù)據(jù)的強(qiáng)一致性。在各個非關(guān)系型數(shù)據(jù)庫中,nosql對一致性的支持很有限,mongodb在同一個collection(關(guān)系型數(shù)據(jù)庫的表)中的操作是原子性的,hbase則是只提供行級服務(wù)。因此,在使用非關(guān)系型數(shù)據(jù)庫時,需要把需求事務(wù)的數(shù)據(jù)存儲在一個表中,作為一個整體單位。當(dāng)這個單位很大、層級很多時,每次操作不一定需要處理全部數(shù)據(jù),可能只需要讀寫部分層級。那么,此時將整體表結(jié)構(gòu)全部讀寫,將耗費(fèi)不必要的系統(tǒng)開銷、網(wǎng)絡(luò)傳輸?shù)荣Y源。
技術(shù)實(shí)現(xiàn)要素:
為了減少客戶端的資源開銷、網(wǎng)絡(luò)傳輸?shù)拈_銷以及減少對數(shù)據(jù)無謂的加載,本發(fā)明實(shí)施例提供一種非關(guān)系型數(shù)據(jù)庫的控制方法及裝置。
根據(jù)本發(fā)明的一個方面,提供一種非關(guān)系型數(shù)據(jù)庫的控制方法,包括:按照業(yè)務(wù)類型,將業(yè)務(wù)數(shù)據(jù)存儲在該業(yè)務(wù)類型對應(yīng)的數(shù)據(jù)表內(nèi),并將所述數(shù)據(jù)表內(nèi)的預(yù)先選定的數(shù)據(jù)確定為延遲加載數(shù)據(jù);在實(shí)際使用所述延遲加載數(shù)據(jù)時,判斷所述延遲加載數(shù)據(jù)是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過;如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫中讀取所述數(shù)據(jù),并將讀取的所述數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;如果讀取過,從保存的已讀取數(shù)據(jù)集合中獲取所述延遲加載數(shù)據(jù)。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括數(shù)據(jù)長度超過字段閾值的大字段數(shù)據(jù);所述方法還包括:在首次讀取而非實(shí)際使用所述大字段數(shù)據(jù)時,直接忽略不做讀取操作。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括多級數(shù)據(jù),所述多級數(shù)據(jù)是指以樹形結(jié)構(gòu)存儲的數(shù)據(jù);所述方法還包括:分層級獲取多級數(shù)據(jù),每次僅獲取一級數(shù)據(jù)。
優(yōu)選的,所述多級數(shù)據(jù)包括父級數(shù)據(jù)和子級數(shù)據(jù);所述分層級獲取多級數(shù)據(jù),每次僅獲取一級數(shù)據(jù),包括:首次獲取多級數(shù)據(jù)時,僅從所述非關(guān)系型數(shù)據(jù)庫獲取父級數(shù)據(jù),忽略子級數(shù)據(jù),并將所述父級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中;當(dāng)需要使用所述子級數(shù)據(jù)時,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述子級數(shù)據(jù),如果讀取過,則從所述已讀取數(shù)據(jù)集合中獲取所述子級數(shù)據(jù);如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫讀取所述子級數(shù)據(jù),并將所述子級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中。
優(yōu)選的,還包括:對于所述延遲加載數(shù)據(jù),設(shè)置已讀取標(biāo)志,用于表明是否已從所述非關(guān)系型數(shù)據(jù)庫中讀取過;通過是否具有所述已讀取標(biāo)志,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述延遲加載數(shù)據(jù)。
優(yōu)選的,還包括:在向已讀取數(shù)據(jù)集合存儲數(shù)據(jù)時,僅保存具有所述已讀取標(biāo)志的數(shù)據(jù),和/或,根據(jù)新增數(shù)據(jù)請求增加數(shù)據(jù),和/或,根據(jù)刪除數(shù)據(jù)請求刪除數(shù)據(jù)。
根據(jù)本發(fā)明的另一個方面,提供一種非關(guān)系型數(shù)據(jù)庫的控制裝置,包括:延遲加載數(shù)據(jù)確定單元,用于按照業(yè)務(wù)類型,將業(yè)務(wù)類型對應(yīng)的業(yè)務(wù)數(shù)據(jù)存儲在數(shù)據(jù)表內(nèi),并將數(shù)據(jù)表內(nèi)的預(yù)先選定的數(shù)據(jù)確定為延遲加載數(shù)據(jù);延遲加載數(shù)據(jù)獲取單元,用于在實(shí)際使用所述延遲加載數(shù)據(jù)時,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過,如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫中讀取所述延遲加載數(shù)據(jù),并將讀取的所述延遲加載數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;如果讀取過,從保存的已讀取數(shù)據(jù)集合中獲取所述延遲加載數(shù)據(jù)。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括數(shù)據(jù)長度超過字段閾值的大字段數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元還用于,在首次讀取而非實(shí)際使用所述大字段數(shù)據(jù)時,直接忽略不做讀取操作。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括多級數(shù)據(jù),所述多級數(shù)據(jù)是指以樹形結(jié)構(gòu)存儲的數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元還用于:分層級獲取多級數(shù)據(jù),每次僅獲取一級數(shù)據(jù)。
優(yōu)選的,所述多級數(shù)據(jù)包括父級數(shù)據(jù)和子級數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元具體用于:首次獲取多級數(shù)據(jù)時,僅從所述非關(guān)系型數(shù)據(jù)庫獲取父級數(shù)據(jù),忽略子級數(shù)據(jù),并將父級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中;當(dāng)需要使用所述子級數(shù)據(jù)時,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述子級數(shù)據(jù),如果讀取過,則從所述已讀取數(shù)據(jù)集合中獲取所述子級數(shù)據(jù),如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫讀取所述子級數(shù)據(jù),并將所述子級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中。
優(yōu)選的,還包括:已讀取標(biāo)志設(shè)置單元,用于對于所述延遲加載數(shù)據(jù),設(shè)置已讀取標(biāo)志,用于表明是否已從所述非關(guān)系型數(shù)據(jù)庫中讀取過;所述延遲加載數(shù)據(jù)獲取單元,通過是否具有所述已讀取標(biāo)志,判斷之前是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述延遲加載數(shù)據(jù)。
優(yōu)選的,還包括:數(shù)據(jù)存儲單元,用于在向所述已讀取數(shù)據(jù)集合存儲數(shù)據(jù)時,僅保存具有所述已讀取標(biāo)志的數(shù)據(jù),和/或,根據(jù)新增數(shù)據(jù)請求增加數(shù)據(jù),和/或,根據(jù)刪除數(shù)據(jù)請求刪除數(shù)據(jù)。
可見,本發(fā)明通過將某個業(yè)務(wù)的業(yè)務(wù)數(shù)據(jù)(關(guān)聯(lián)的數(shù)據(jù))保存在數(shù)據(jù)表中,這樣可以保證其事務(wù)性;然后對于該數(shù)據(jù)表中的特定數(shù)據(jù)(例如多級數(shù)據(jù)或大字段數(shù)據(jù))標(biāo)記為延遲加載,從而僅在實(shí)際使用數(shù)據(jù)時才進(jìn)行數(shù)據(jù)獲取的操作。并且,數(shù)據(jù)獲取的具體方式是,首先判斷數(shù)據(jù)之前是否已經(jīng)讀取過,如果讀取過,則從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù);如果沒有讀取過,才從數(shù)據(jù)庫中獲取數(shù)據(jù)。本發(fā)明可減少客戶端系統(tǒng)的資源開銷以及網(wǎng)絡(luò)傳輸?shù)拈_銷,減少對數(shù)據(jù)無謂的加載。本發(fā)明對業(yè)務(wù)邏輯是透明的,因?yàn)閷?shí)現(xiàn)了對子級數(shù)據(jù)做動態(tài)獲取,業(yè)務(wù)并不需要關(guān)心數(shù)據(jù)是否從數(shù)據(jù)庫中獲取了。本發(fā)明應(yīng)用于非關(guān)系型數(shù)據(jù)庫,其具有非關(guān)系型數(shù)據(jù)庫所具有的特點(diǎn),例如高可用性、高擴(kuò)展性,可以解決大數(shù)據(jù)存儲與高并發(fā)讀寫的問題。
附圖說明
圖1是本發(fā)明一個實(shí)施例提供的一種非關(guān)系型數(shù)據(jù)庫的控制方法流程圖;
圖2是本發(fā)明一個實(shí)施例提供的一種多級數(shù)據(jù)存儲結(jié)構(gòu)示意圖;
圖3是本發(fā)明一個實(shí)施例提供的一種多級數(shù)據(jù)存儲結(jié)構(gòu)更新示意圖;
圖4是本發(fā)明一個實(shí)施例提供的一種非關(guān)系型數(shù)據(jù)庫的控制裝置流程圖。
具體實(shí)施方式
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對本發(fā)明作進(jìn)一步詳細(xì)的說明。
如前所述的,現(xiàn)有針對非關(guān)系型數(shù)據(jù)庫的控制方案中,需要處理全部數(shù)據(jù),將耗費(fèi)不必要的系統(tǒng)開銷、網(wǎng)絡(luò)傳輸?shù)荣Y源。例如,一個表有父、子、孫三級,當(dāng)只需要父級數(shù)據(jù),此時將整體讀取出來,就浪費(fèi)了讀取子孫的資源。層級越多,耗費(fèi)越多。同理,當(dāng)只需要處理某些字段,排除大字段時,讀取整體也會耗費(fèi)不必要的資源。
本發(fā)明實(shí)施例提供一種非關(guān)系型數(shù)據(jù)庫的控制方法,概括而言,通過將特定數(shù)據(jù)(多級數(shù)據(jù)或大字段數(shù)據(jù))標(biāo)記為延遲加載,并在實(shí)際使用該特定數(shù)據(jù)時,首先判斷數(shù)據(jù)是否已被讀取過,如果是,從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù),如果沒有讀取過,才從非關(guān)系型數(shù)據(jù)庫中獲取數(shù)據(jù)。這種方式可以避免頻繁讀取數(shù)據(jù)庫,減少系統(tǒng)開銷和網(wǎng)絡(luò)傳輸資源的消耗。
參見圖1,為本發(fā)明實(shí)施例提供的一種非關(guān)系型數(shù)據(jù)庫的控制方法流程圖,該方法包括s101-s102。
s101:按照業(yè)務(wù)類型,將業(yè)務(wù)類型對應(yīng)的業(yè)務(wù)數(shù)據(jù)存儲在數(shù)據(jù)表內(nèi),并將數(shù)據(jù)表內(nèi)的預(yù)先選定的數(shù)據(jù)確定為延遲加載數(shù)據(jù)。
將某個業(yè)務(wù)的業(yè)務(wù)數(shù)據(jù)(關(guān)聯(lián)的數(shù)據(jù))保存在一個的數(shù)據(jù)表中,這樣可以保證其事務(wù)性;然后對于該表中的特定數(shù)據(jù)標(biāo)記為延遲加載。
所謂延遲加載,也稱為懶加載,其含義是只有在真正需要數(shù)據(jù)時,才真正執(zhí)行數(shù)據(jù)加載操作,從而避免一些無謂的性能開銷。使用延遲加載的原因,是當(dāng)要訪問的數(shù)據(jù)量過大時,使用緩存不太適合,因?yàn)閮?nèi)存容量有限,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,使數(shù)據(jù)在需要的時候才進(jìn)行加載。比如部門entity(數(shù)據(jù)實(shí)體)和員工entity,部門與員工1對多,如果lazy(延遲加載標(biāo)志)設(shè)置為false(否),那么只要加載了一個部門的po(持久對象,persistantobject,可以理解一個po就是數(shù)據(jù)庫中的一條記錄),就會根據(jù)一對多配置的關(guān)系把所有員工的po也加載出來。但是實(shí)際上,有時只是需要用到部門的信息,不需要用到員工的信息,這時員工po的加載就等于浪費(fèi)資源。如果lazy設(shè)置為true(是),那么只有當(dāng)訪問部門po的員工信息時才會加載員工的po的信息。
本發(fā)明實(shí)施例中,對于特定數(shù)據(jù)進(jìn)行延遲加載標(biāo)記,從而對這些特定數(shù)據(jù)進(jìn)行延遲加載,即,僅在實(shí)際需要使用該數(shù)據(jù)時才進(jìn)行加載。
特定數(shù)據(jù)包括但不限于多級數(shù)據(jù)或大字段數(shù)據(jù)等。多級數(shù)據(jù)是指類似樹形結(jié)構(gòu)存儲的數(shù)據(jù),例如包括父級、子級的數(shù)據(jù),或者包括父級、子級、孫級的數(shù)據(jù)。對于多級數(shù)據(jù),如果每次都讀取全部級的數(shù)據(jù),往往造成資源消耗過度,并且實(shí)際情況往往是僅需要讀取上層級的數(shù)據(jù),例如,僅需要獲取父級數(shù)據(jù)的情況,如果此時將子級以及孫級數(shù)據(jù)都獲取,勢必造成數(shù)據(jù)的無謂讀取,造成資源消耗。大字段數(shù)據(jù)是指數(shù)據(jù)的字段大于一定字段閾值的數(shù)據(jù)。對于大字段數(shù)據(jù),由于數(shù)據(jù)量較大,如果每次都從數(shù)據(jù)庫中讀取,也會造成資源消耗。
因此,對于多級數(shù)據(jù)和大字段數(shù)據(jù),標(biāo)記上延遲加載,從而在后續(xù)處理時,僅在實(shí)際使用數(shù)據(jù)時,才進(jìn)行獲取數(shù)據(jù)的操作,而且,獲取數(shù)據(jù)時,首先判斷是否之前已經(jīng)讀取過,如果讀取過,則從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù),如果之前沒有讀取過,才從數(shù)據(jù)庫中獲取數(shù)據(jù);如果不是實(shí)際使用數(shù)據(jù),例如僅是首次讀取操作等,則無需從數(shù)據(jù)庫中真正獲取數(shù)據(jù)。
s102:在實(shí)際使用延遲加載數(shù)據(jù)時,判斷是否已從非關(guān)系型數(shù)據(jù)庫讀取過,如果沒有讀取過,則從非關(guān)系型數(shù)據(jù)庫中讀取數(shù)據(jù),并將讀取的數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;如果讀取過,從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù)。
如前分析的,對于多級數(shù)據(jù)或大字段數(shù)據(jù),如果每次收到相關(guān)讀取操作請求,都從數(shù)據(jù)庫獲取數(shù)據(jù),會對數(shù)據(jù)庫頻繁讀取,造成資源消耗和浪費(fèi),因此,通過對多級數(shù)據(jù)或大字段數(shù)據(jù)標(biāo)記為延遲加載,僅在實(shí)際使用數(shù)據(jù)時,才進(jìn)行獲取數(shù)據(jù)的操作。而且,獲取數(shù)據(jù)時,首先判斷是否之前已經(jīng)讀取過,如果讀取過,則從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù),如果之前沒有讀取過,才從數(shù)據(jù)庫中獲取數(shù)據(jù);如果不是實(shí)際使用數(shù)據(jù),例如僅是首次讀取操作等,則無需從數(shù)據(jù)庫中真正獲取數(shù)據(jù)。
對于大字段數(shù)據(jù),為了盡可能避免無謂的從數(shù)據(jù)庫進(jìn)行獲取,優(yōu)選方式中,在首次讀取該大字段數(shù)據(jù)時,直接忽略不做讀取操作。僅在實(shí)際使用該大字段數(shù)據(jù)時,才執(zhí)行從數(shù)據(jù)庫或已讀取數(shù)據(jù)集合中獲取該大字段數(shù)據(jù)的操作。
對于多級數(shù)據(jù),為了盡可能避免無謂的從數(shù)據(jù)庫進(jìn)行獲取,優(yōu)選方式中,分層級獲取多級數(shù)據(jù),每次僅獲取一級數(shù)據(jù)。
例如,對于多級數(shù)據(jù)包括父級數(shù)據(jù)和子級數(shù)據(jù)的情況,分層級獲取多級數(shù)據(jù)、每次僅獲取一級數(shù)據(jù)的具體過程是:首次獲取多級數(shù)據(jù)時,僅從非關(guān)系型數(shù)據(jù)庫獲取父級數(shù)據(jù),忽略子級數(shù)據(jù),并將父級數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;當(dāng)需要使用子級數(shù)據(jù)時,判斷是否已從非關(guān)系型數(shù)據(jù)庫讀取過子級數(shù)據(jù),如果讀取過,則從已讀取數(shù)據(jù)集合中獲取子級數(shù)據(jù),如果沒有讀取過,則從非關(guān)系型數(shù)據(jù)庫讀取子級數(shù)據(jù),并將子級數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中。
再如,對于多級數(shù)據(jù)包括父級數(shù)據(jù)、子級數(shù)據(jù)和孫級數(shù)據(jù)的情況,分層級獲取多級數(shù)據(jù)、每次僅獲取一級數(shù)據(jù)的具體過程是:首次獲取多級數(shù)據(jù)時,僅從非關(guān)系型數(shù)據(jù)庫獲取父級數(shù)據(jù),忽略子級數(shù)據(jù),并將父級數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;當(dāng)需要使用子級數(shù)據(jù)時,判斷是否已從非關(guān)系型數(shù)據(jù)庫讀取過子級數(shù)據(jù),如果讀取過,則從已讀取數(shù)據(jù)集合中獲取子級數(shù)據(jù),如果沒有讀取過,則從非關(guān)系型數(shù)據(jù)庫讀取子級數(shù)據(jù),并將子級數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;當(dāng)需要使用孫級數(shù)據(jù)時,判斷是否已從非關(guān)系型數(shù)據(jù)庫讀取過孫級數(shù)據(jù),如果讀取過,則從已讀取數(shù)據(jù)集合中獲取孫級數(shù)據(jù),如果沒有讀取過,則從非關(guān)系型數(shù)據(jù)庫讀取孫級數(shù)據(jù),并將孫級數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中。
需要說明的是,上述僅是示例性說明,對于超過三級的更多級數(shù)據(jù),也同樣原理同樣適用。
可見,這種方式保證從上至下(根到分支)獲取各個層級的數(shù)據(jù),且每次僅獲取一個層級的數(shù)據(jù),如上面的例子,首先獲取父級數(shù)據(jù),然后獲取子級數(shù)據(jù),最后獲取孫級數(shù)據(jù)。
其中,已讀取數(shù)據(jù)集合可以理解是預(yù)先設(shè)置的一個空集合,每次從數(shù)據(jù)庫中獲取到標(biāo)記了延遲加載的數(shù)據(jù)時,將該數(shù)據(jù)加入到該已讀取數(shù)據(jù)集合中,并且不斷更新該集合;當(dāng)然,已讀取數(shù)據(jù)集合也可以理解為在第一次從數(shù)據(jù)庫中獲取到標(biāo)記了延遲加載的數(shù)據(jù)時生成的集合,并且在后續(xù)不斷更新。
在具體操作中,可以通過為標(biāo)記了延遲加載的數(shù)據(jù)設(shè)置一個已讀取標(biāo)志,用于表明是否已從非關(guān)系型數(shù)據(jù)庫中讀取過;通過已讀取標(biāo)志,判斷之前是否已從非關(guān)系型數(shù)據(jù)庫讀取過所述數(shù)據(jù)??梢岳斫猓哂幸炎x取標(biāo)志的數(shù)據(jù),需要添加到已讀取數(shù)據(jù)集合中,反之,已讀取數(shù)據(jù)集合中的數(shù)據(jù)都應(yīng)該具有已讀取標(biāo)志。
在對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)存儲時,可根據(jù)具有所述已讀取標(biāo)志的數(shù)據(jù)(已讀取數(shù)據(jù)集合中的數(shù)據(jù))進(jìn)行存儲,另外,也可根據(jù)新增或刪除的數(shù)據(jù),對數(shù)據(jù)進(jìn)行保存。例如,保存一條數(shù)據(jù)時,只保存讀取過的或者新增/刪除的數(shù)據(jù)。如前描述的,對于多級數(shù)據(jù),可以以樹形結(jié)構(gòu)作為數(shù)據(jù)結(jié)構(gòu),此時,如果更新一條樹形結(jié)構(gòu)的數(shù)據(jù),則根據(jù)已讀取數(shù)據(jù)以及新增/刪除的數(shù)據(jù),對原樹形結(jié)構(gòu)進(jìn)行更新。
如前分析的,對于多級數(shù)據(jù),分層級獲取,每次只獲取一級數(shù)據(jù)。首次讀取父級數(shù)據(jù)時,子級數(shù)據(jù)直接排除掉不取,當(dāng)需要使用子級數(shù)據(jù)時,判斷有沒有讀取過,如果讀取過,則直接返回數(shù)據(jù)。如果判斷為未讀取過,此時到數(shù)據(jù)庫中讀取再返回。在返回的數(shù)據(jù)中,孫級數(shù)據(jù)如果未讀取過,則不讀取,直接返回子級數(shù)據(jù),如果孫級數(shù)據(jù)已經(jīng)讀取過,則子孫級數(shù)據(jù)同時返回。以此類推,逐級獲取。
圖2示出了多級數(shù)據(jù)存儲結(jié)構(gòu)的樹形結(jié)構(gòu)示意圖。以圖2為例,如果需要獲取到節(jié)點(diǎn)m,那么客戶端只需獲取節(jié)點(diǎn)a、c、g、m,其他節(jié)點(diǎn)不會被讀取。
保存一條數(shù)據(jù)時,只保存讀取過的或者新增/刪除的節(jié)點(diǎn)數(shù)據(jù)。上面圖2例子中只讀取了節(jié)點(diǎn)a、c、g、m,此時如果增加節(jié)點(diǎn)o,刪除節(jié)點(diǎn)b。則只保存a、c、g、m、o這五個節(jié)點(diǎn),刪除節(jié)點(diǎn)b及其子節(jié)點(diǎn),其余節(jié)點(diǎn)保留。那么此時的樹就變?yōu)閳D3所示。
綜上所述,由于只讀取/更新需要處理的節(jié)點(diǎn),如此一來,即可保證數(shù)據(jù)的一致性,也會最大程度減少系統(tǒng)開銷。
本發(fā)明實(shí)施例適用于各種類型的非關(guān)系型數(shù)據(jù)庫。例如,面向文檔存儲的nosql數(shù)據(jù)庫,其支持多級內(nèi)嵌文檔的存儲,再例如mongodb、couchdb,則更加適合本發(fā)明實(shí)施例的應(yīng)用。而面向key-value存儲的數(shù)據(jù)庫,例如hbase、cassandra,雖然實(shí)現(xiàn)多級數(shù)據(jù)的延遲加載難度加大,但可輕易實(shí)現(xiàn)一級數(shù)據(jù)的延遲加載,在很多應(yīng)用場景下完全可以滿足需求,也有巨大的實(shí)現(xiàn)價值。
下面以使用java語言基于mongodb實(shí)現(xiàn)(也可通過其他語言、數(shù)據(jù)庫來實(shí)現(xiàn))為例,對本發(fā)明實(shí)施例涉及的一些原理和算法做如下說明。
1.使用annotation(注釋)標(biāo)記某字段的getter方法為延遲加載(懶加載)方法。
2.遍歷所有層級的每個getter方法,通過反射機(jī)制(動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的機(jī)制)創(chuàng)建一個懶加載的字段集合a。
3.利用aop(aspectorientedprogramming,將函數(shù)的輔助性功能與業(yè)務(wù)邏輯相分離的編程泛型)技術(shù),將所有標(biāo)記為懶加載的getter方法設(shè)置為切點(diǎn),創(chuàng)建一個切面,用來實(shí)際處理懶加載的代碼。
4.使用ltw(loadtimeweaver,加載期切面織入)或者ctw(compiletimeweaver,編譯時織入)技術(shù),將切面編織進(jìn)getter方法,在執(zhí)行該方法前執(zhí)行切面代碼。
5.為每個有懶加載字段的類創(chuàng)建一個特殊標(biāo)記,用于區(qū)別null(失效),并使其可以被反復(fù)引用。這個特殊標(biāo)記可以是個代理、也可以是具有特殊記號的類實(shí)例,例如id=-1等,或者通過其他方式實(shí)現(xiàn)。若字段指向null代表真實(shí)為空,存儲數(shù)據(jù)時將其清空。指向特殊標(biāo)記代表字段未被從數(shù)據(jù)庫讀取過,存儲數(shù)據(jù)時,忽略不處理,維持現(xiàn)狀。
6.在讀取數(shù)據(jù)時,將a中的字段(可以是子實(shí)體或大字段)指向特殊標(biāo)記,作為判斷是否從數(shù)據(jù)庫中讀取過的依據(jù),然后將正常數(shù)據(jù)返回。如果需要加載指向特殊標(biāo)記的字段,調(diào)用getter方法后,去數(shù)據(jù)庫中動態(tài)獲取(只取這一個字段),然后通過反射機(jī)制將字段從指向特殊標(biāo)記設(shè)為指向?qū)嶋H的數(shù)據(jù),后續(xù)反復(fù)調(diào)用getter方法不會重復(fù)從數(shù)據(jù)庫取。如果懶加載出來的數(shù)據(jù)中也包含需要懶加載的字段,則將它們指向特殊標(biāo)記,后面需要加載的時候再通過切面代碼讀數(shù)據(jù)庫。如此逐級獲取。
7.在存儲數(shù)據(jù)時,遍歷所有節(jié)點(diǎn),判斷字段是否指向特殊標(biāo)記。如果是,將該字段名放入一個集合b,其子實(shí)體可忽略不再判斷;如果不是,再判斷其子實(shí)體,指向特殊標(biāo)記,放入b。如此按照層級遞歸。最終在保存時,忽略掉所有b中的字段,將需要保存的數(shù)據(jù)作為一個整體一次性存入,被忽略的字段在數(shù)據(jù)庫不會被清空,維持現(xiàn)狀。
如此,便可實(shí)現(xiàn)數(shù)據(jù)的懶加載,根據(jù)需要動態(tài)加載數(shù)據(jù)。對數(shù)據(jù)的整體保存也是原子操作,保證了數(shù)據(jù)的一致性。將其封裝到dao層(java語言中的層),變可使其對業(yè)務(wù)層透明,達(dá)到業(yè)務(wù)邏輯無感知的效果。
本發(fā)明實(shí)施例中,將某個業(yè)務(wù)的業(yè)務(wù)數(shù)據(jù)(關(guān)聯(lián)的數(shù)據(jù))保存在一個數(shù)據(jù)表中,這樣可以保證其事務(wù)性;然后對于該數(shù)據(jù)表中的特定數(shù)據(jù)(例如多級數(shù)據(jù)或大字段數(shù)據(jù))標(biāo)記為延遲加載,從而僅在實(shí)際使用數(shù)據(jù)時才進(jìn)行數(shù)據(jù)獲取的操作,并且,數(shù)據(jù)獲取的具體方式是,首先判斷數(shù)據(jù)之前是否已經(jīng)讀取過,如果讀取過,則從保存的已讀取數(shù)據(jù)集合中獲取數(shù)據(jù),如果沒有讀取過,才從數(shù)據(jù)庫中獲取數(shù)據(jù)。本發(fā)明可減少客戶端系統(tǒng)的資源開銷以及網(wǎng)絡(luò)傳輸?shù)拈_銷,減少對數(shù)據(jù)無謂的加載。本發(fā)明對業(yè)務(wù)邏輯是透明的,因?yàn)閷?shí)現(xiàn)了對子級數(shù)據(jù)做動態(tài)獲取,業(yè)務(wù)并不需要關(guān)心數(shù)據(jù)是否從數(shù)據(jù)庫中獲取了。本發(fā)明應(yīng)用于非關(guān)系型數(shù)據(jù)庫,其具有固有的高可用性、高擴(kuò)展性,可以解決大數(shù)據(jù)存儲與高并發(fā)讀寫的問題。
需要說明的是,對于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明實(shí)施例并不受所描述的動作順序的限制,因?yàn)橐罁?jù)本發(fā)明實(shí)施例,某些步驟可以采用其他順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動作并不一定是本發(fā)明實(shí)施例所必須的。
參照圖4,是本發(fā)明實(shí)施例提供的一種非關(guān)系型數(shù)據(jù)庫的控制裝置結(jié)構(gòu)示意圖。該裝置包括:
延遲加載數(shù)據(jù)確定單元401,用于按照業(yè)務(wù)類型,將業(yè)務(wù)類型對應(yīng)的業(yè)務(wù)數(shù)據(jù)存儲在數(shù)據(jù)表內(nèi),并將數(shù)據(jù)表內(nèi)的預(yù)先選定的數(shù)據(jù)確定為延遲加載數(shù)據(jù);
延遲加載數(shù)據(jù)獲取單元402,用于在實(shí)際使用延遲加載數(shù)據(jù)時,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過,如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫中讀取所述數(shù)據(jù),并將讀取的所述數(shù)據(jù)加入到已讀取數(shù)據(jù)集合中;如果讀取過,從保存的所述已讀取數(shù)據(jù)集合中獲取所述數(shù)據(jù),。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括數(shù)據(jù)長度超過字段閾值的大字段數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元402還用于,在首次讀取而非實(shí)際使用所述大字段數(shù)據(jù)時,直接忽略不做讀取操作。
優(yōu)選的,所述預(yù)先選定的數(shù)據(jù)包括多級數(shù)據(jù),所述多級數(shù)據(jù)是指采用樹形結(jié)構(gòu)存儲的數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元402還用于:分層級獲取多級數(shù)據(jù),每次僅獲取一級數(shù)據(jù)。
優(yōu)選的,所述多級數(shù)據(jù)包括父級數(shù)據(jù)和子級數(shù)據(jù);所述延遲加載數(shù)據(jù)獲取單元402具體用于:首次獲取多級數(shù)據(jù)時,僅從所述非關(guān)系型數(shù)據(jù)庫獲取父級數(shù)據(jù),忽略子級數(shù)據(jù),并將父級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中;當(dāng)需要使用所述子級數(shù)據(jù)時,判斷是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述子級數(shù)據(jù),如果讀取過,則從所述已讀取數(shù)據(jù)集合中獲取所述子級數(shù)據(jù),如果沒有讀取過,則從所述非關(guān)系型數(shù)據(jù)庫讀取所述子級數(shù)據(jù),并將所述子級數(shù)據(jù)加入到所述已讀取數(shù)據(jù)集合中。
優(yōu)選的,還包括:已讀取標(biāo)志設(shè)置單元403,用于對于延遲加載數(shù)據(jù),設(shè)置已讀取標(biāo)志,用于表明是否已從所述非關(guān)系型數(shù)據(jù)庫中讀取過;所述延遲加載數(shù)據(jù)獲取單元402,通過所述已讀取標(biāo)志,判斷之前是否已從所述非關(guān)系型數(shù)據(jù)庫讀取過所述延遲加載數(shù)據(jù)。
優(yōu)選的,還包括:數(shù)據(jù)存儲單元404,用于在向已讀取數(shù)據(jù)集合存儲數(shù)據(jù)時,僅保存具有所述已讀取標(biāo)志的數(shù)據(jù),和/或,根據(jù)新增數(shù)據(jù)請求增加數(shù)據(jù),和/或,根據(jù)刪除數(shù)據(jù)請求刪除數(shù)據(jù)。
對于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個實(shí)施例之間相同相似的部分互相參見即可。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明實(shí)施例的實(shí)施例可提供為方法、裝置、或計算機(jī)程序產(chǎn)品。因此,本發(fā)明實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明實(shí)施例可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實(shí)施的計算機(jī)程序產(chǎn)品的形式。
本發(fā)明實(shí)施例是參照根據(jù)本發(fā)明實(shí)施例的方法、終端設(shè)備(系統(tǒng))、和計算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機(jī)程序指令到通用計算機(jī)、專用計算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器以產(chǎn)生一個機(jī)器,使得通過計算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機(jī)程序指令也可存儲在能引導(dǎo)計算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備以特定方式工作的計算機(jī)可讀存儲器中,使得存儲在該計算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機(jī)程序指令也可裝載到計算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備上,使得在計算機(jī)或其他可編程終端設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機(jī)實(shí)現(xiàn)的處理,從而在計算機(jī)或其他可編程終端設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
盡管已描述了本發(fā)明實(shí)施例的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明實(shí)施例范圍的所有變更和修改。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實(shí)體或者操作與另一個實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的相同要素。
以上對本發(fā)明所提供的一種關(guān)系型數(shù)據(jù)庫的調(diào)度方法及系統(tǒng),進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。