專利名稱:用于處理消息隊(duì)列的方法、設(shè)備和計(jì)算機(jī)程序的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理系統(tǒng),更具體地,涉及通過這樣的系統(tǒng)對消息隊(duì)列進(jìn)行的處理。
背景技術(shù):
經(jīng)常需要將行為序列“重放(replay)”到數(shù)據(jù)庫或者其它系統(tǒng)(如消息發(fā)送系統(tǒng))中。
該序列可以以各種級別表示,例如,日志重放(在恢復(fù)中使用)、事務(wù)改變重放(使用在數(shù)據(jù)庫復(fù)制中)、或者呼叫重放(屬于所進(jìn)行的呼叫的檢查日志,可能在SQL或者存儲(chǔ)的過程級別上、或者甚至在更高的應(yīng)用級別上)。
經(jīng)常地,原始行為的執(zhí)行與數(shù)據(jù)庫事務(wù)和確保邏輯順序(有時(shí)候僅部分順序)的鎖定技術(shù)高度平行。這個(gè)并行性對獲得好的系統(tǒng)性能是必需的。
以將被重放的序列表示用數(shù)據(jù)庫事務(wù)和鎖定技術(shù)確保的邏輯順序。問題在于必須盡可能快地重放,并且這也需要一定的并行度。然而,仍舊需要保持原始的邏輯次序。
作為示例,考慮將重放的序列表示為工作項(xiàng)隊(duì)列的系統(tǒng)。每個(gè)工作項(xiàng)表示原始的事務(wù),并包含將要進(jìn)行的數(shù)據(jù)庫記錄級別更新列表。
(在這里使用術(shù)語更新包括改變數(shù)據(jù)庫的任何操作,至少包括SQLINSERT、DELETE和UPDATE語句,并且還包括諸如數(shù)據(jù)定義更新之類的任何其它更新。)其自然(非常簡單化的)實(shí)現(xiàn)是單個(gè)“主事務(wù)”線程//主事務(wù)線程for each work item//即原始事務(wù)get(e.g.read)work itemfor each recorde update in work itemapply update//例如,記錄級別更新end for each update
commit(work item read operation and database update operation)end for each work item然而,每個(gè)“施加(apply)更新”(其通常需要在可以施加更新之前取出(例如,讀取)的相關(guān)數(shù)據(jù)庫記錄)可能需要當(dāng)前沒有保存在與數(shù)據(jù)庫相關(guān)聯(lián)的緩沖池中的數(shù)據(jù),因此處理延遲直到取回(retrieve)所需要的數(shù)據(jù)。這樣,問題在于可能嚴(yán)重影響處理吞吐量。
當(dāng)然理解的是,由于可能使用標(biāo)準(zhǔn)的數(shù)據(jù)庫懶寫入(lazy write)技術(shù),所以實(shí)際上將更新返回到數(shù)據(jù)庫盤也具有對應(yīng)的問題。
盡管這個(gè)問題可施加到消息發(fā)送系統(tǒng),但是它較不重要。由于大多數(shù)隊(duì)列活動(dòng)在隊(duì)列結(jié)束時(shí)是可預(yù)測的,所以可以適當(dāng)可預(yù)測地預(yù)取將要讀取的消息緩沖池。換言之,典型地以FIFO(先入先出)順序讀取隊(duì)列,并且,這樣可以可預(yù)測地且連續(xù)地預(yù)取該隊(duì)列。
在數(shù)據(jù)庫系統(tǒng)中進(jìn)行這樣的預(yù)測是非常困難的。這是因?yàn)?,從?shù)據(jù)庫中依次讀取的記錄典型地散布在整個(gè)數(shù)據(jù)庫盤中,并且,對數(shù)據(jù)庫的工作可能不需要依次(即,連續(xù)地)存儲(chǔ)的數(shù)據(jù)記錄。
美國專利6092154公布了一種在多媒體環(huán)境中使用線程列表對數(shù)據(jù)進(jìn)行預(yù)先超高速緩存的方法。通過主應(yīng)用而把將需要的數(shù)據(jù)列表(讀取請求)傳遞到數(shù)據(jù)存儲(chǔ)裝置中。然而,在多媒體環(huán)境中,可以通過主應(yīng)用而方便地指定作為讀取請求的結(jié)果而需要的數(shù)據(jù)。在數(shù)據(jù)庫環(huán)境中,主應(yīng)用可能不知道存儲(chǔ)數(shù)據(jù)的方式,或者即使它知道,主應(yīng)用可能也不能夠?qū)⑵浜线m地傳送到數(shù)據(jù)存儲(chǔ)裝置。這樣,有可能后續(xù)操作所需要的部分?jǐn)?shù)據(jù)將不可用。
美國專利6449696也公開了利用讀取請求基于列表內(nèi)容而從盤中預(yù)取數(shù)據(jù)。
發(fā)明內(nèi)容
因此,本發(fā)明提供了一種用于處理消息隊(duì)列的方法,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該方法包括以下步驟瀏覽消息;從所瀏覽的消息中提取更新請求;以及將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS),其中,偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
優(yōu)選地將偽更新請求轉(zhuǎn)換成為預(yù)取請求;并預(yù)取所需要的數(shù)據(jù)。
優(yōu)選地,隨后啟動(dòng)真實(shí)更新請求,該真實(shí)更新請求使用預(yù)取的數(shù)據(jù)來執(zhí)行。優(yōu)選地,破壞性地從隊(duì)列中得到包括更新的消息。優(yōu)選地,該破壞性獲得與實(shí)際的數(shù)據(jù)庫更新相互協(xié)調(diào)(兩個(gè)階段的提交),使得直到已經(jīng)實(shí)際接收到對更新的確認(rèn)才刪除消息的副本。
在一個(gè)實(shí)施例中,主線程執(zhí)行啟動(dòng)更新請求的步驟,并且一個(gè)或多個(gè)提前讀取線程執(zhí)行瀏覽消息的步驟。
優(yōu)選地,保持主線程落后提前讀取線程預(yù)定處理量??梢愿鶕?jù)消息、更新等來估量(measure)這個(gè)處理量,并且該處理量有助于確保數(shù)據(jù)在需要時(shí)存在于存儲(chǔ)器中。如果主線程太近,則有在要求執(zhí)行更新請求時(shí)所需要的數(shù)據(jù)可能不在存儲(chǔ)器中的危險(xiǎn)。另一方面,如果主線程落后太遠(yuǎn),則存在存儲(chǔ)器變得太滿而導(dǎo)致不得不重寫還沒有使用的數(shù)據(jù)的危險(xiǎn)。
在一個(gè)實(shí)施例中,預(yù)取請求具有被保留的預(yù)定形式,并且將標(biāo)識(shí)符與其關(guān)聯(lián),以便可以標(biāo)識(shí)所保留的預(yù)定形式,并用于真實(shí)更新請求的隨后執(zhí)行中。優(yōu)選地,響應(yīng)偽更新請求而返回該標(biāo)識(shí)符。
在一個(gè)實(shí)施例中,由DBMS將偽更新轉(zhuǎn)換成為具有預(yù)定形式并與標(biāo)識(shí)符相關(guān)聯(lián)的預(yù)取請求。該標(biāo)識(shí)符接收自DBMS并在發(fā)布真實(shí)更新請求時(shí)使用。
優(yōu)選地,響應(yīng)將預(yù)取的數(shù)據(jù)用于更新請求,通知存儲(chǔ)器管理器可以將所已使用的所預(yù)取的數(shù)據(jù)從存儲(chǔ)器丟棄。這有助于避免存儲(chǔ)器變滿溢。
根據(jù)一個(gè)方面,提供了一種用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)上對DBMS所控制的數(shù)據(jù)庫的更新請求進(jìn)行預(yù)處理的方法,該方法包括在DBMS上接收更新請求;在DBMS上接收指示該更新請求是偽更新請求、并因此DBMS不應(yīng)該執(zhí)行該更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示;將偽更新請求轉(zhuǎn)換成為預(yù)取請求;以及基于該預(yù)取請求來預(yù)取所需要的數(shù)據(jù)。
優(yōu)選地,隨后接收真實(shí)更新請求,并且使用所預(yù)取的數(shù)據(jù)來執(zhí)行真實(shí)更新請求。
在一個(gè)實(shí)施例中,預(yù)取請求具有預(yù)定的形式并被保留。然后,將標(biāo)識(shí)符優(yōu)選地與所保留的預(yù)定形式相關(guān)聯(lián),以便可以標(biāo)識(shí)所保留的預(yù)定形式,并用于真實(shí)更新請求的隨后執(zhí)行中。優(yōu)選地,響應(yīng)該偽更新請求而返回該標(biāo)識(shí)符。
在一個(gè)實(shí)施例中,利用真實(shí)更新請求接收標(biāo)識(shí)符,并將其用于真實(shí)更新請求的執(zhí)行中。
根據(jù)另一方面,提供了一種用于處理消息隊(duì)列的設(shè)備,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該設(shè)備包括用于瀏覽消息的裝置;用于從所瀏覽的消息中提取更新請求的裝置;以及用于將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS)的裝置,該偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
根據(jù)另一方面,提供了一種用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)上對DBMS所控制的數(shù)據(jù)庫的更新請求進(jìn)行預(yù)處理的設(shè)備,該設(shè)備包括用于在DBMS上接收更新請求的裝置;用于在DBMS上接收指示該更新請求是偽更新請求、并因此DBMS不應(yīng)該執(zhí)行該更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示的裝置;用于將偽更新請求轉(zhuǎn)換成為預(yù)取請求的裝置;以及用于基于預(yù)取請求來預(yù)取所需要的數(shù)據(jù)的裝置。
根據(jù)另一方面,提供了一種用于處理消息隊(duì)列的計(jì)算機(jī)程序,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該計(jì)算機(jī)程序包括適配為當(dāng)在計(jì)算機(jī)上運(yùn)行時(shí)執(zhí)行包括如下步驟的方法的程序代碼裝置瀏覽消息;從所瀏覽的消息中提取更新請求;以及將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS),其中,偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
根據(jù)另一個(gè)方面,提供了一種用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)上對DBMS所控制的數(shù)據(jù)庫的更新請求進(jìn)行預(yù)處理的計(jì)算機(jī)程序,該計(jì)算機(jī)程序適配為包括當(dāng)在計(jì)算機(jī)上運(yùn)行時(shí)執(zhí)行如下方法步驟的程序代碼裝置在DBMS上接收更新請求;在DBMS上接收指示該更新請求是偽更新請求、并因此DBMS不應(yīng)該執(zhí)行該更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示;將偽更新請求轉(zhuǎn)換成為預(yù)取請求;以及該基于預(yù)取請求來預(yù)取所需要的數(shù)據(jù)。
圖1示出根據(jù)現(xiàn)有技術(shù)的數(shù)據(jù)庫系統(tǒng);圖2圖解根據(jù)優(yōu)選實(shí)施例的本發(fā)明的處理;以及圖3進(jìn)一步圖解根據(jù)優(yōu)選實(shí)施例的本發(fā)明的處理。
具體實(shí)施例方式
圖1示出根據(jù)現(xiàn)有技術(shù)的數(shù)據(jù)庫系統(tǒng)。系統(tǒng)10具有用于執(zhí)行處理的工作項(xiàng)(消息)隊(duì)列20。每項(xiàng)工作表示對數(shù)據(jù)庫30中的記錄的至少一個(gè)更新。
從右向左(FIFO順序)讀取工作隊(duì)列20,這樣,可以將數(shù)據(jù)庫30所需要的數(shù)據(jù)看作數(shù)據(jù)項(xiàng)(記錄)A、B、C、D。(注意,每項(xiàng)工作可以表示多于一個(gè)更新,且因此可以從數(shù)據(jù)庫30要求多于一個(gè)記錄。)施加應(yīng)用(apply application)40從隊(duì)列20讀取,并從數(shù)據(jù)庫管理系統(tǒng)(DBMS)70(經(jīng)由數(shù)據(jù)庫接口45)請求合適的數(shù)據(jù)。該DBMS包括查詢處理器50(包括分析程序),其經(jīng)由緩沖池管理器(沒有示出)從緩沖池60(易失性存儲(chǔ)器)請求數(shù)據(jù)。如果在緩沖池中沒有找到數(shù)據(jù)(這是有可能的),則必須從數(shù)據(jù)庫本身取出數(shù)據(jù)。因?yàn)閿?shù)據(jù)庫可能在盤上存儲(chǔ)數(shù)以千計(jì)的記錄,并且因?yàn)槲幢厥且钥深A(yù)測順序存儲(chǔ)數(shù)據(jù),所以,雖然將所需要的數(shù)據(jù)取回到緩沖池60中,但是可能會(huì)嚴(yán)重影響系統(tǒng)的吞吐量。在這個(gè)例子中,工作隊(duì)列20要求以那個(gè)順序?qū)⒂涗汚、B、C和D取出,但是盤以完全不同的順序(A、C、D、B)存儲(chǔ)這些記錄。為此,預(yù)測性地預(yù)取記錄(即,通常按序列順序)對數(shù)據(jù)庫是沒用的,例如,在讀取A后得到C。
本發(fā)明要解決這個(gè)問題。圖2圖解根據(jù)優(yōu)選實(shí)施例的本發(fā)明的處理,并應(yīng)該結(jié)合圖1看圖2。
施加應(yīng)用40中的主提前讀取線程瀏覽來自隊(duì)列20的每個(gè)工作項(xiàng)(步驟100)。如先前所論述的,每個(gè)工作項(xiàng)包括數(shù)據(jù)庫30的所請求的至少一個(gè)更新。對于每一個(gè)這樣的請求更新,生成先驅(qū)更新線程(步驟110)。每個(gè)先驅(qū)更新線程(經(jīng)由DBMS 50)啟動(dòng)將所要求的數(shù)據(jù)的取到緩沖池60中,使得當(dāng)被請求時(shí)可以對數(shù)據(jù)庫30施加適當(dāng)?shù)母?步驟120)。
先驅(qū)更新線程沒有改變數(shù)據(jù)庫本身(它們僅僅讀取數(shù)據(jù)),這樣,可以容易地并行施加這些線程。這個(gè)并行性允許數(shù)據(jù)庫使它的I/O方案最優(yōu)化(以與將在原始事務(wù)的并行執(zhí)行期間具有的方式相同的方式)。
先驅(qū)呼叫的完全實(shí)現(xiàn)優(yōu)選地確保將所有的相關(guān)數(shù)據(jù)(與記錄和索引二者有關(guān)的)讀入到緩沖池。例如,進(jìn)行設(shè)置人員#1234的薪水到50000的更新。這將可能包括人員記錄本身,和與人員#有關(guān)的對人員表的索引。如果有關(guān)于薪水的索引,則也優(yōu)選地將其預(yù)取。
有三種可以用來獲得先驅(qū)更新(偽更新)的機(jī)制機(jī)制A其中,先驅(qū)線程將更新請求轉(zhuǎn)換成為相關(guān)聯(lián)的預(yù)取請求,其為查詢(即,取出合適數(shù)據(jù)而不實(shí)際執(zhí)行更新本身的查詢),并且將該請求發(fā)布到數(shù)據(jù)庫。這樣,用關(guān)于人員#1234的查詢模擬了該先驅(qū)呼叫。
機(jī)制B其中,擴(kuò)展數(shù)據(jù)庫接口45,以便允許先驅(qū)線程向數(shù)據(jù)庫指示該呼叫是先驅(qū)呼叫(偽更新請求)而不是“真實(shí)”的更新。先驅(qū)線程從工作項(xiàng)中提取更新請求(圖3的步驟200);將該更新請求發(fā)送到DBMS(步驟210);并(經(jīng)由具有更新請求的指示)通知DBMS,這個(gè)是偽更新請求,使得DBMS可以將偽更新請求轉(zhuǎn)換成為預(yù)取請求以便取出所需要的數(shù)據(jù)(步驟220)。
機(jī)制C其中,進(jìn)一步擴(kuò)展數(shù)據(jù)庫接口45,例如,通過在呼叫之間傳遞用于更新的標(biāo)記(標(biāo)識(shí)符),使得來自先驅(qū)線程(啟動(dòng)預(yù)取請求)和來自主事務(wù)線程(即,隨后執(zhí)行所請求的更新的線程)的呼叫明顯相關(guān)聯(lián)。注意,機(jī)制C優(yōu)選地為機(jī)制B的擴(kuò)展。
機(jī)制A不涉及對數(shù)據(jù)庫的改變。然而,它在將更新轉(zhuǎn)換成為相關(guān)查詢時(shí)通過而涉及施加應(yīng)用的更多工作。也有可能該查詢將沒有強(qiáng)制數(shù)據(jù)庫讀取緩沖池中的所有合適數(shù)據(jù);在這個(gè)例子中,可以適當(dāng)?shù)夭活A(yù)取關(guān)于薪水的索引的相關(guān)部分。這是因?yàn)椋┘討?yīng)用可能沒有完全理解數(shù)據(jù)庫如何存儲(chǔ)它的信息,或者可能發(fā)現(xiàn)難以將合適的請求傳達(dá)到DBMS。在機(jī)制B中解決了這些問題。
在機(jī)制B中,將偽更新請求轉(zhuǎn)換成為預(yù)取請求,并將其用于取出在執(zhí)行對應(yīng)的真實(shí)更新被請求時(shí)將需要的數(shù)據(jù)。因?yàn)镈BMS產(chǎn)生了預(yù)取請求,所以更有可能要預(yù)取用于具體真實(shí)更新請求的所有需要數(shù)據(jù)。DBMS知道存儲(chǔ)數(shù)據(jù)的方式,并能夠?qū)⑵溆行У剞D(zhuǎn)換成為合適的預(yù)取請求。
為了更完全地說明機(jī)制C,當(dāng)由施加應(yīng)用生成先驅(qū)更新請求時(shí),將其發(fā)送到查詢處理器,以便查詢處理器將該更新請求解析成為內(nèi)部(預(yù)定)形式。這個(gè)內(nèi)部形式用于確定從數(shù)據(jù)庫中取回什么數(shù)據(jù)。一旦取回了數(shù)據(jù),則可以丟棄這個(gè)內(nèi)部形式。然而,在這么做的過程中,當(dāng)主線程希望進(jìn)行該真實(shí)更新時(shí),將不得不再次解析該更新請求。
為了節(jié)約時(shí)間和處理功率,查詢處理器可以保存作為先驅(qū)更新請求結(jié)果的解析的內(nèi)部形式,并且,這可以與被傳遞回到施加應(yīng)用的標(biāo)記相關(guān)聯(lián)。當(dāng)主事務(wù)線程希望進(jìn)行該更新請求時(shí),可以由施加應(yīng)用將相同的標(biāo)記傳遞到DBMS,然后,這可以用于確定該請求的合適解析內(nèi)部形式。這個(gè)改進(jìn)消除了對兩次解析的需求。
緩沖池管理器(沒有示出)還優(yōu)選地使用機(jī)制C的查詢標(biāo)記,以確定何時(shí)不再需要預(yù)取的數(shù)據(jù)項(xiàng)。當(dāng)將該標(biāo)記從施加應(yīng)用傳遞回到DBMS以便實(shí)施更新時(shí),從緩沖池中取回相關(guān)數(shù)據(jù),然后,優(yōu)選地將標(biāo)記傳遞到緩沖池管理器,以便向其指示可以從緩沖池中消除與該標(biāo)記相關(guān)聯(lián)的數(shù)據(jù)。僅僅在這樣的情況中優(yōu)選地將數(shù)據(jù)從緩沖池中消除。
這將降低以下風(fēng)險(xiǎn)預(yù)取的數(shù)據(jù)甚至在對其有需求之前就被從緩沖池中消除、或者相反地在緩沖池中被保留過長時(shí)間而對其它數(shù)據(jù)不利。
應(yīng)該注意,盡管通過施加應(yīng)用可以在沒有改變數(shù)據(jù)庫實(shí)現(xiàn)或者接口的情況下實(shí)現(xiàn)機(jī)制A,但機(jī)制B和C需要改變數(shù)據(jù)庫接口和實(shí)現(xiàn)。
如上面所提到的,主提前讀取線程在主事務(wù)線程(也在施加應(yīng)用40中運(yùn)行)之前操作。主事務(wù)線程以與提前讀取線程在前面所作相同的方式得到每個(gè)工作項(xiàng),但是,這次卻實(shí)際上將工作項(xiàng)從隊(duì)列中消除,以便實(shí)際進(jìn)行所請求的更新。因?yàn)樘崆白x取(和先驅(qū)線程)已經(jīng)提前確定主事務(wù)線程將需要的數(shù)據(jù),所以應(yīng)該已經(jīng)將需要的數(shù)據(jù)取到緩沖池60中了。這樣,緩沖池管理器應(yīng)該能夠直接從緩沖池60中取回主線程所請求的數(shù)據(jù),以便可以進(jìn)行所請求的更新。由于可以馬上得到所請求的數(shù)據(jù),所以,I/O沒有延遲,并且大大改進(jìn)了這個(gè)執(zhí)行。(如前面陳述的,可以使用標(biāo)準(zhǔn)的懶寫入技術(shù)來實(shí)際上將更新的數(shù)據(jù)返回到盤中。)由于執(zhí)行的原因,重要的是主事務(wù)線程沒有太接近或者遠(yuǎn)遠(yuǎn)落后于主提前讀取線程。(如果主線程遠(yuǎn)遠(yuǎn)落后,則可能在還沒有使用老數(shù)據(jù)時(shí)不得不用新數(shù)據(jù)重寫緩沖池;如果主線程太接近于提前讀取線程,則該數(shù)據(jù)可能在對其尚沒有需求之前就已經(jīng)被適當(dāng)?shù)仡A(yù)取到緩沖池中了。)這樣,優(yōu)選的是在主提前讀取線程和主事務(wù)線程之間存在一些形式的信令,以便防止此發(fā)生。
因此,優(yōu)選地允許主提前讀取線程(以及從而其先驅(qū)線程)在主事務(wù)線程之前不多于預(yù)定量(requiredReadahead)(例如,在處理的工作項(xiàng)、處理的更新或者處理的字節(jié)中所估量的)。
這樣,施加應(yīng)用40具有兩個(gè)計(jì)數(shù)器,readaheadAmountProcessed和masterAmountProcessed。在優(yōu)選的實(shí)施例中,根據(jù)所處理的工作項(xiàng)來估量requiredReadahead值。每當(dāng)提前讀取線程移動(dòng)到下一個(gè)工作項(xiàng),就增加readaheadAmountProcessed。每當(dāng)主線程完成工作項(xiàng)的處理,就增加masterAmountProcessed。主提前讀取線程包括睡眠循環(huán)(sleep loop),其促使提前讀取線程所控制的任何先驅(qū)線程也睡眠while(readaheadAmountProcessed-masterAmountProcessed>requiredReadahead)sleep(10)以這個(gè)方式,提前讀取線程沒有在主線程之前太遠(yuǎn)。這很重要,因?yàn)榉駝t,存在緩沖池60將變得滿因此有必要將那里還沒有被使用的數(shù)據(jù)移除的風(fēng)險(xiǎn)。
主線程也包括睡眠循環(huán)while(readaheadAmountProcessed-masterAmountProcessed<requiredReadahead)sleep(10)這確保主線程沒有超過主提前讀取線程。
注意,提前讀取項(xiàng)的完成可以不是以有序的方式出現(xiàn),因此難以精確地限定提前讀取已經(jīng)到達(dá)多遠(yuǎn)。這樣,可以使這個(gè)信令更高級,以允許精確地完成先驅(qū)更新。
應(yīng)該注意的是,在某些情況下,更新是以第一更新的執(zhí)行改變實(shí)現(xiàn)后面的更新所必須讀取的數(shù)據(jù)的方式而彼此依賴。例如
開始,佛瑞德(Fred)在Y部門。
將佛瑞德移動(dòng)到X部門。
將佛瑞德的部門的管理者改變?yōu)楸葼枴?br>
對[1]的先驅(qū)執(zhí)行將把佛瑞德的數(shù)據(jù)讀取到緩沖池中。這個(gè)數(shù)據(jù)將在后面主事務(wù)線程執(zhí)行[1]時(shí)使用。[2]的先驅(qū)執(zhí)行可能發(fā)生在這個(gè)更新之前,并因此把Y部門(佛瑞德的老部門)的數(shù)據(jù)讀取到緩沖池中。然而,[2]的真實(shí)執(zhí)行將要求X部門(佛瑞德的新部門)的數(shù)據(jù)在緩沖池中。
在這些情況中,主事務(wù)線程可以在執(zhí)行對應(yīng)的真實(shí)更新時(shí)延遲(即,因?yàn)樗枰臄?shù)據(jù)沒有在緩沖池中)。這將輕微地?fù)p害性能,但是通常地,無論如何性能都將比現(xiàn)有技術(shù)方法改進(jìn)很多。注意,將不會(huì)導(dǎo)致錯(cuò)誤結(jié)果(因?yàn)閷⑦M(jìn)行事務(wù)本身的無序處理)。
改進(jìn)/變化現(xiàn)在將描述基于上述基本思想的一些改進(jìn)/變化。
至此所論述的實(shí)施例使用具有為每個(gè)先驅(qū)更新生成(產(chǎn)生)的新線程的單個(gè)提前讀取線程,并在其工作結(jié)束時(shí)終止。
然而,線程產(chǎn)生/終止是耗費(fèi)大的處理。這樣,可以代替使用線程池。在這個(gè)實(shí)施例中,先驅(qū)更新線程池持續(xù)可用,并且,當(dāng)它們的工作結(jié)束時(shí),它們就稍后返回到池中以便再次使用。
另一個(gè)選項(xiàng)(可以結(jié)合線程池使用)是具有多于一個(gè)提前讀取線程,并且多個(gè)提前讀取線程分擔(dān)工作。在一個(gè)實(shí)施例中,還使用了提前讀取線程池。
該多個(gè)提前讀取線程還優(yōu)選地彼此用信號(hào)通知其負(fù)責(zé)哪一個(gè)工作項(xiàng)。以這個(gè)方式,提前讀取線程不會(huì)試圖做另一個(gè)提前讀取線程已經(jīng)完成(或者正在完成的處理中)的工作,即,沒有多余地重復(fù)工作。
一種非常簡單的實(shí)現(xiàn)是第一提前讀取線程負(fù)責(zé)工作項(xiàng)1、4和7;第二提前讀取線程瀏覽工作項(xiàng)2、5和8;而第三提前讀取線程負(fù)責(zé)工作項(xiàng)3、6和9。
基于該基本原理的另一個(gè)改進(jìn)是使用批處理。并行執(zhí)行原始的事務(wù),使得它們的日志強(qiáng)制(log force)(用于備份的目的)可能裝箱(boxcar)(并行批處理)。這是有用的,因?yàn)槿罩緩?qiáng)制是處理器密集并持有其它處理,直到該強(qiáng)制結(jié)束。
主事務(wù)線程被單獨(dú)執(zhí)行線程(這對于保存邏輯順序很重要),并且因此沒有實(shí)施裝箱。然而,事務(wù)批處理可以用于僅在已經(jīng)發(fā)生確定量的處理(根據(jù)時(shí)間、#消息、#更新、#字節(jié)估量的)之后執(zhí)行的提交操作。由于每個(gè)提交操作也對日志引起強(qiáng)制操作,所以事務(wù)批處理使得能夠一次強(qiáng)制更大量的數(shù)據(jù),而不是頻繁中斷多個(gè)(消耗時(shí)間的)日志強(qiáng)制的主事務(wù)線程。
另一個(gè)選項(xiàng)是使用成對的主事務(wù)線程。利用單個(gè)主事務(wù)線程,這個(gè)線程將發(fā)送一批更新到DBMS以便處理,然后向其發(fā)送提交(或者最后的命令)。然后,主事務(wù)線程將不得不在DBMS把更新強(qiáng)制到數(shù)據(jù)庫盤時(shí)等待。在等待從主線程(從提交)返回的控制時(shí),另一個(gè)線程優(yōu)選地正處理另一批更新,例如,使每批日志強(qiáng)制與隨后批次的處理并行。
將理解,盡管根據(jù)將行為序列重放到數(shù)據(jù)庫中而描述本發(fā)明,但是本發(fā)明不限于此。它可應(yīng)用于存在將要處理的消息隊(duì)列并包括對數(shù)據(jù)的隨機(jī)存取的任何情況中。
權(quán)利要求
1.一種用于處理消息隊(duì)列的方法,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該方法包括以下步驟瀏覽消息;從所瀏覽的消息中提取更新請求;以及將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS),其中,偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
2.根據(jù)權(quán)利要求1的方法,包括以下步驟將偽更新請求轉(zhuǎn)換成為預(yù)取請求;以及預(yù)取所需要的數(shù)據(jù)。
3.根據(jù)權(quán)利要求1的方法,包括以下步驟通過破壞性地得到包括更新請求的消息而啟動(dòng)真實(shí)更新請求,該真實(shí)更新請求使用預(yù)取的數(shù)據(jù)。
4.根據(jù)權(quán)利要求3的方法,其中主線程執(zhí)行啟動(dòng)真實(shí)更新請求的步驟,并且其中一個(gè)或多個(gè)提前讀取線程執(zhí)行瀏覽消息的步驟。
5.根據(jù)權(quán)利要求4的方法,包括以下步驟保持主線程落后提前讀取線程預(yù)定處理量。
6.根據(jù)權(quán)利要求2的方法,其中,預(yù)取請求是預(yù)定的形式,并且該方法還包括以下步驟保留該預(yù)定的形式;使標(biāo)識(shí)符與所保留的預(yù)定形式相關(guān)聯(lián),以便所保留的預(yù)定形式可以被標(biāo)識(shí),并用于真實(shí)更新請求的隨后執(zhí)行中;以及響應(yīng)偽更新請求而返回該標(biāo)識(shí)符。
7.根據(jù)權(quán)利要求1的方法,其中,由DBMS將偽更新轉(zhuǎn)換成為具有預(yù)定形式并與標(biāo)識(shí)符相關(guān)聯(lián)的預(yù)取請求,該方法包括以下步驟從DBMS接收標(biāo)識(shí)符;以及利用更新請求通過發(fā)送標(biāo)識(shí)符而發(fā)布真實(shí)更新請求。
8.根據(jù)權(quán)利要求1的方法,包括以下步驟通知存儲(chǔ)器管理器已使用的所預(yù)取的數(shù)據(jù)可以從存儲(chǔ)器丟棄。
9.一種用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)上對DBMS所控制的數(shù)據(jù)庫的更新請求進(jìn)行預(yù)處理的方法,該方法包括在DBMS上接收更新請求;在DBMS上接收指示該更新請求是偽更新請求、并因此DBMS不應(yīng)該執(zhí)行該更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示;將偽更新請求轉(zhuǎn)換成為預(yù)取請求;以及基于該預(yù)取請求來預(yù)取所需要的數(shù)據(jù)。
10.根據(jù)權(quán)利要求9的方法,包括以下步驟接收真實(shí)更新請求;以及使用所預(yù)取的數(shù)據(jù)來執(zhí)行真實(shí)更新請求。
11.根據(jù)權(quán)利要求9的方法,其中,預(yù)取請求具有預(yù)定的形式,該方法還包括以下步驟保留該預(yù)定的形式;使標(biāo)識(shí)符與所保留的預(yù)定形式相關(guān)聯(lián),以便所保留的預(yù)定形式可以被識(shí)別,并用于真實(shí)更新請求的隨后執(zhí)行中;以及響應(yīng)該偽更新請求而返回該標(biāo)識(shí)符。
12.根據(jù)權(quán)利要求11的方法,包括以下步驟利用真實(shí)更新請求接收標(biāo)識(shí)符;在執(zhí)行真實(shí)更新請求時(shí)使用與標(biāo)識(shí)符相關(guān)聯(lián)的預(yù)定形式。
13.根據(jù)權(quán)利要求9的方法,包括以下步驟通知存儲(chǔ)器管理器已使用的所預(yù)取的數(shù)據(jù)可以從存儲(chǔ)器中丟棄。
14.一種用于處理消息隊(duì)列的設(shè)備,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該設(shè)備包括用于瀏覽消息的裝置;用于從所瀏覽的消息中提取更新請求的裝置;以及用于將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS)的裝置,該偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
15.一種用于處理消息隊(duì)列的計(jì)算機(jī)程序,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求,該計(jì)算機(jī)程序包括適配為當(dāng)在計(jì)算機(jī)上運(yùn)行時(shí)執(zhí)行包括如下步驟的方法的程序代碼裝置瀏覽消息;從所瀏覽的消息中提取更新請求;以及將偽更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS),其中,偽更新請求包括指示DBMS不應(yīng)該執(zhí)行更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
16.一種用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)上對DBMS所控制的數(shù)據(jù)庫的更新請求進(jìn)行預(yù)處理的計(jì)算機(jī)程序,該計(jì)算機(jī)程序適配為包括當(dāng)在計(jì)算機(jī)上運(yùn)行時(shí)執(zhí)行如下方法步驟的程序代碼裝置在DBMS上接收更新請求;在DBMS上接收指示該更新請求是偽更新請求、并因此DBMS不應(yīng)該執(zhí)行該更新而應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示;將偽更新請求轉(zhuǎn)換成為預(yù)取請求;以及該基于預(yù)取請求來預(yù)取所需要的數(shù)據(jù)。
全文摘要
本發(fā)明涉及對消息隊(duì)列的處理,每個(gè)消息表示至少一個(gè)用于對數(shù)據(jù)庫進(jìn)行更新的請求。瀏覽消息,并且從該消息中提取至少一個(gè)更新請求。將該更新請求發(fā)送到負(fù)責(zé)要更新的數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。還向DBMS發(fā)送指示該更新請求是偽更新請求、并且DBMS不應(yīng)該執(zhí)行更新而是應(yīng)該預(yù)取當(dāng)請求對應(yīng)的真實(shí)更新時(shí)所需要的數(shù)據(jù)的指示。
文檔編號(hào)G06F17/30GK1829964SQ200480021628
公開日2006年9月6日 申請日期2004年6月16日 優(yōu)先權(quán)日2003年8月2日
發(fā)明者斯蒂芬·J·托德 申請人:國際商業(yè)機(jī)器公司