專利名稱::確定底層數(shù)據(jù)改變?nèi)绾斡绊懜咚倬彺鎸?duì)象的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明與Challenger等的題為“維護(hù)和一致性更新高速緩沖存儲(chǔ)器的可剪裁方法”(USPNo.08/905,225)的待決美國(guó)專利申請(qǐng)S/N(待定)(與本申請(qǐng)同日受理)有關(guān)。該專利申請(qǐng)與本發(fā)明一起賦予國(guó)際商用機(jī)器公司(IBM),Armonk,紐約。這里把該專利申請(qǐng)全文引用作為參考。本發(fā)明涉及一種改進(jìn)的數(shù)據(jù)處理系統(tǒng)。各具體方面與萬維網(wǎng)(worldwideweb)、數(shù)據(jù)庫及事務(wù)處理系統(tǒng)有關(guān)。更具體地說,涉及萬維網(wǎng)上動(dòng)態(tài)資料的高速緩沖存儲(chǔ)。從萬維網(wǎng)上提取資料所能達(dá)到的速度是萬維網(wǎng)在傳送信息和支持電子商務(wù)方面可用性如何的重要因素之一。萬維網(wǎng)服務(wù)器必須能快速地把內(nèi)容提供給用戶。由萬維網(wǎng)服務(wù)器發(fā)送的數(shù)據(jù)可分為兩類(1)靜態(tài)數(shù)據(jù)。這類數(shù)據(jù)是從計(jì)算機(jī)上存儲(chǔ)的文件中得到的。靜態(tài)數(shù)據(jù)能被較快地提供給用戶。在計(jì)算機(jī)上運(yùn)行的高性能服務(wù)器(如單個(gè)RS/6000590節(jié)點(diǎn))通常每秒能發(fā)送數(shù)百個(gè)文件。(2)動(dòng)態(tài)數(shù)據(jù)。這類數(shù)據(jù)是通過發(fā)出請(qǐng)求時(shí)執(zhí)行程序得到的。通常建立動(dòng)態(tài)數(shù)據(jù)是花費(fèi)很大的。在許多情況下,得到動(dòng)態(tài)數(shù)據(jù)的花費(fèi)比得到靜態(tài)數(shù)據(jù)的花費(fèi)要高一至二個(gè)數(shù)量級(jí)。對(duì)于含有的動(dòng)態(tài)數(shù)據(jù)占很高百分比的萬維網(wǎng)站點(diǎn),動(dòng)態(tài)數(shù)據(jù)性能會(huì)成為瓶頸。含有高百分比動(dòng)態(tài)數(shù)據(jù)的站點(diǎn)實(shí)例包括使用IBM網(wǎng)商務(wù)軟件的電子商務(wù)站點(diǎn)。如LLBean萬維網(wǎng)站點(diǎn)(www.llbean.com)和IBM1996奧林匹克萬維網(wǎng)站點(diǎn)。減小動(dòng)態(tài)數(shù)據(jù)總開銷的一種方法是在由程序建立起動(dòng)態(tài)頁之后把這些動(dòng)態(tài)頁存儲(chǔ)在高速緩沖存儲(chǔ)器中(見Y.H.Liu,P.Dantzig,C.E.Wu,J.Challenger,L.M.Ni的“多平臺(tái)上的分布式萬維網(wǎng)服務(wù)器及其性能分析”,分布式計(jì)算系統(tǒng)國(guó)際會(huì)議文集,1996年5月)。這樣,其后需要訪問這些頁的請(qǐng)求可以訪問高速緩沖存儲(chǔ)器中的副本。一頁只需由程序計(jì)算一次。于是減少或消除了為響應(yīng)多次請(qǐng)求而多次重新計(jì)算同一頁所需的開銷。高速緩存不能應(yīng)用于所有的動(dòng)態(tài)萬維網(wǎng)頁。某些動(dòng)態(tài)頁會(huì)引起狀態(tài)變化,這些狀態(tài)變化必須在這些頁面被請(qǐng)求時(shí)發(fā)生。這種頁面不能被高速緩存。對(duì)于能被高速緩存的頁面,仍需要一種方法,用于當(dāng)可能影響一個(gè)或幾個(gè)萬維網(wǎng)頁之值的底層數(shù)據(jù)發(fā)生變化時(shí)去更新高速緩沖存儲(chǔ)器。例如,往往由數(shù)據(jù)庫來建造動(dòng)態(tài)萬維網(wǎng)頁。當(dāng)數(shù)據(jù)庫改變時(shí),可能會(huì)特別難于確定由于數(shù)據(jù)庫的改變使哪些高速緩存對(duì)象已成為過時(shí)的。本發(fā)明為這一問題提供了一種解決方案。這種解決方案是相當(dāng)通用的,能被用于需要知道底層數(shù)據(jù)變化如何影響對(duì)象值的其他場(chǎng)合。另一個(gè)問題是當(dāng)?shù)讓訑?shù)據(jù)源和高速緩沖存儲(chǔ)器在地理上分離時(shí)如何保持一個(gè)或多個(gè)高速緩沖存儲(chǔ)器能被更新。本發(fā)明有一個(gè)對(duì)此問題的解決方案,它與動(dòng)態(tài)和靜態(tài)兩類數(shù)據(jù)的代理高速緩存有關(guān)。第三個(gè)問題是如何使對(duì)一個(gè)或多個(gè)高速緩沖存儲(chǔ)器的更新保持前后一致性,從而使所有更新立即完成,而且由系統(tǒng)收到的請(qǐng)求所看到的關(guān)于更新的系統(tǒng)內(nèi)容不會(huì)是比后來收到的請(qǐng)求所看到的系統(tǒng)內(nèi)容更遲。本發(fā)明對(duì)于與靜態(tài)和動(dòng)態(tài)數(shù)據(jù)兩者的代理高速緩存有關(guān)的一致性問題有一個(gè)解決方案。它也與事務(wù)處理系統(tǒng)有關(guān),這些系統(tǒng)不一定涉及高速緩沖存儲(chǔ)器。在技術(shù)上已知有應(yīng)用程序去管理為建立計(jì)算機(jī)程序所必須的文件之間的依賴關(guān)系。例如,單個(gè)程序可能由多個(gè)源文件和目標(biāo)文件構(gòu)成。已經(jīng)研制出了管理源文件、目標(biāo)文件及可執(zhí)行文件之間依賴關(guān)系的工具。用于管理這種依賴關(guān)系的最有名的實(shí)用程序之一是Unix的make命令(例如參見IBMAIX第4版在線手冊(cè)頁)。如make這類實(shí)用程序需要用戶在一個(gè)稱作makefile的特殊文件中指定各文件之間的依賴關(guān)系。例如,可把如下關(guān)于文件依賴關(guān)系的說明放在一個(gè)makefile文件中foo:foo.hfoo.ccc-ofoofoo.c以指出“foo”依賴于“foo.h”和“foo.c”。當(dāng)下一次發(fā)出“makefoo”命令時(shí),對(duì)“foo.h”或“foo.c”的任何改變都會(huì)造成利用命令“cc-ofoofoo.c”對(duì)“foo”的重新編譯。如makefile之類實(shí)用程序有若干限制,包括(1)makfile只允許被指定的文件之間的依賴關(guān)系。指定一個(gè)文件和不是文件的某種東西之間的依賴關(guān)系是不可能的。需要一種方法,它允許指定能存儲(chǔ)在高速緩沖存儲(chǔ)器中的對(duì)象與不能被高速緩存的圖對(duì)象(它包括底層數(shù)據(jù))之間的依賴關(guān)系。(2)利用makefile方法時(shí),每當(dāng)被“make”命令發(fā)現(xiàn)文件過時(shí)時(shí),所有過時(shí)文件都被更新而不管文件可能會(huì)是怎樣過時(shí)的。也需要一種方法,它不要求過時(shí)的對(duì)象總是被更新;于是,例如一個(gè)稍許過時(shí)的過時(shí)文件可以被保留在高速緩沖存儲(chǔ)器中。(3)makefile方法還只允許在文件系統(tǒng)中一個(gè)時(shí)候只存在文件的一個(gè)版本。需要一種方法允許在同一高速緩沖存儲(chǔ)器中同時(shí)存在同一對(duì)象的多個(gè)版本。(4)還需要一種方法能提供確定對(duì)象過時(shí)程度的定量方法,這是makefile之類工具所沒有提供的。(5)需要一種定量方法來確定同一對(duì)象兩個(gè)版本的相似程度,這也是makefile之類工具所沒有提供的。(6)還需要一種方法來保持一組具有一致性的可能過時(shí)的對(duì)象,這也是makefile之類工具所沒有提供的。(7)需要一種方法精確地指定稱作關(guān)系對(duì)象的對(duì)象(它們可能是關(guān)系數(shù)據(jù)庫的一部分)之間的依賴關(guān)系,這是makefile之類工具所沒有提供的。本發(fā)明致力滿足這些需要。在許多情況中,對(duì)象的值依賴于底層數(shù)據(jù)。本發(fā)明的目標(biāo)是確定底層數(shù)據(jù)的變化如何影響對(duì)象的值。作為一例,考慮一個(gè)萬維網(wǎng)站點(diǎn),它的頁面是由數(shù)據(jù)庫動(dòng)態(tài)建立的。在這種場(chǎng)合,動(dòng)態(tài)萬維網(wǎng)頁面是對(duì)象而底層數(shù)據(jù)包括數(shù)據(jù)庫。在一些情況下,一個(gè)萬維網(wǎng)頁可能依賴于一個(gè)類似的網(wǎng)頁,而這后一個(gè)網(wǎng)頁又依賴于一個(gè)數(shù)據(jù)庫。有可能建立一個(gè)完整的依賴關(guān)系結(jié)構(gòu),其中一些對(duì)象依賴于其他對(duì)象,而這其他對(duì)象又依賴于另一些對(duì)象。也有可能建立一組對(duì)象之間的共同依賴關(guān)系,其中對(duì)這一組對(duì)象中任何一個(gè)對(duì)象的更新影響到該組中所有其他對(duì)象的值。本發(fā)明另一方面的目標(biāo)是提供一種方法來指定對(duì)象和底層數(shù)據(jù)之間的依賴關(guān)系,它允許底層數(shù)據(jù)變化后由計(jì)算機(jī)系統(tǒng)把更新內(nèi)容傳播到系統(tǒng)中的所有對(duì)象。該方法包括如下的一個(gè)或多個(gè)特點(diǎn)1.能以層次結(jié)構(gòu)形式指定依賴關(guān)系,這里一些對(duì)象可能依賴于另一些對(duì)象,而這另一些對(duì)象又依賴于另一些對(duì)象,如此等等。2.多組對(duì)象能有共同依賴關(guān)系。例如,兩個(gè)對(duì)象彼此之間有這樣的關(guān)系,它們指明每當(dāng)其中一個(gè)對(duì)象的值變化時(shí)另一個(gè)對(duì)象的值便發(fā)生變化。3.一種方法,能保證每當(dāng)一個(gè)對(duì)象所依賴的底層數(shù)據(jù)變化時(shí)該對(duì)象便被更新(或被令其無效)。4.一種定量方法,用于確定一個(gè)對(duì)象的過時(shí)版本與當(dāng)前版本有多大不同。5.一種方法,能保證當(dāng)一個(gè)對(duì)象與當(dāng)前版本有足夠大差異時(shí)被更新或被令其無效。當(dāng)總是保持一個(gè)對(duì)象為當(dāng)前版本會(huì)造成太大開銷時(shí),這種方法是有用的。6.每當(dāng)一個(gè)對(duì)象的值被重新計(jì)算時(shí)便產(chǎn)生該對(duì)象的一個(gè)新版本。能保持同一對(duì)象的多個(gè)版本。對(duì)于同一對(duì)象的兩個(gè)副本,能確定(a)是否這兩個(gè)對(duì)象對(duì)應(yīng)于同一版本因而它們完全相同;(b)如果對(duì)(a)的回答為“否”,那么哪個(gè)版本較新(即建立得較遲);以及(c)如果對(duì)(a)的回答為“否”,則定量指出這兩個(gè)對(duì)象的差異程度。7.一種方法,用于保持一組對(duì)象之間的一致性,而不需要所有對(duì)象都是當(dāng)前的。當(dāng)要求所有對(duì)象為當(dāng)前對(duì)象以保證其一致性會(huì)造成太大開銷時(shí),這種方法是有用的。8.一種方法,用于管理關(guān)系對(duì)象,借以能由對(duì)象管理器自動(dòng)添加關(guān)系對(duì)象之間的隱含數(shù)據(jù)依賴關(guān)系。本發(fā)明的應(yīng)用例包括如下場(chǎng)合1.高速緩存動(dòng)態(tài)萬維網(wǎng)頁。2.客戶機(jī)-服務(wù)器應(yīng)用在許多客戶機(jī)一服務(wù)器應(yīng)用中,服務(wù)器將向多個(gè)客戶機(jī)發(fā)送對(duì)象。這些對(duì)象總是在改變。根據(jù)何時(shí)對(duì)象被請(qǐng)求,同一對(duì)象的不同版本會(huì)被送到不同的客戶機(jī)。該服務(wù)器需要某種方法來保持跟蹤哪些版本被送到哪些客戶機(jī)以及這些版本的過時(shí)程度如何。3.需要滿足下述要求的任何場(chǎng)合維持對(duì)象的若干版本,唯一地識(shí)別它們,如果它們變得太過時(shí)便更新它們,定量評(píng)估同一對(duì)象的兩個(gè)版本差異程度,和/或保持一組對(duì)象之間的一致性。一個(gè)最佳實(shí)施例利用了一個(gè)被定向圖,稱作對(duì)象依賴關(guān)系圖(G),它代表了對(duì)象間的數(shù)據(jù)依賴關(guān)系。從對(duì)象o1到另一對(duì)象o2的邊緣表明o2依賴于o1。對(duì)o1的任何更新也改變o2的當(dāng)前值。在另一個(gè)實(shí)施例中,每個(gè)邊緣能帶有一個(gè)非負(fù)數(shù),稱為權(quán),它代表該數(shù)據(jù)依賴關(guān)系的重要性。例如,大數(shù)能代表重要的依賴關(guān)系,而小的數(shù)代表不重要的依賴關(guān)系。對(duì)象還能帶有一個(gè)值,稱作權(quán)閾值。每當(dāng)那些對(duì)應(yīng)于當(dāng)前的輸入數(shù)據(jù)依賴關(guān)系的權(quán)之和低于權(quán)閾值時(shí),該對(duì)象被認(rèn)為是高度過時(shí)的。對(duì)于那些需要對(duì)象近期版本的應(yīng)用,這類對(duì)象應(yīng)被更新。每個(gè)對(duì)象最好有一個(gè)object_id(對(duì)象標(biāo)識(shí))字段和一個(gè)version_number(版本號(hào))字段。對(duì)象標(biāo)識(shí)字段對(duì)應(yīng)于應(yīng)用程序用來識(shí)別該對(duì)象的某種標(biāo)記(例如URL),而版本號(hào)字段允許保持和唯一識(shí)別有相同對(duì)象標(biāo)識(shí)的多個(gè)對(duì)象。更具體地說,稱作對(duì)象管理器的一個(gè)過程保持?jǐn)?shù)據(jù)依賴關(guān)系信息。每當(dāng)新對(duì)象被創(chuàng)建或數(shù)據(jù)依賴關(guān)系變化,該對(duì)象管理器負(fù)責(zé)更新適當(dāng)?shù)男畔ⅰC慨?dāng)一個(gè)對(duì)象被更新,對(duì)象管理器利用對(duì)象依賴關(guān)系圖中的信息把其他的更新內(nèi)容傳播給被數(shù)據(jù)依賴關(guān)系迫使的系統(tǒng)。每個(gè)對(duì)象o1還可以有一個(gè)一致性列表,它包含那些必須與o1保持一致性的對(duì)象的清單。如果滿足下列條件中的任何一個(gè),則兩個(gè)對(duì)象o1和o2是一致的(1)兩個(gè)對(duì)象都是當(dāng)前的;或(2)在過去的某個(gè)時(shí)候,這兩個(gè)對(duì)象曾是當(dāng)前的。對(duì)o1的更新還會(huì)迫使對(duì)o1的一致性列表上的其他對(duì)象進(jìn)行更新。有可能把一個(gè)對(duì)象與一個(gè)或多個(gè)屬于關(guān)系(這類似于關(guān)系數(shù)據(jù)庫中的關(guān)系)的記錄關(guān)聯(lián)起來。這個(gè)對(duì)象稱作關(guān)系對(duì)象。本發(fā)明還具有在關(guān)系對(duì)象之間自動(dòng)增加依賴關(guān)系的特點(diǎn)。從下文中的詳細(xì)描述及附圖,將更清楚地看出這些和其他特點(diǎn)和優(yōu)點(diǎn),這些圖件是圖1a描述了具有本發(fā)明特征的系統(tǒng)的一例;圖1b描述了具有本發(fā)明特征的對(duì)象依賴關(guān)系圖的一例;圖1c描述了具有本發(fā)明特征的系統(tǒng)的一例;圖2描述了根據(jù)本發(fā)明所使用的高速緩沖存儲(chǔ)器的一例;圖3描述了根據(jù)本發(fā)明所使用的對(duì)象信息塊(OIB)的一例;圖4描述了根據(jù)本發(fā)明的API函數(shù)的一例;圖5描述了實(shí)現(xiàn)圖4的API函數(shù)的一種方法的方框圖;圖6描述了把一個(gè)對(duì)象加到一個(gè)高速緩沖存儲(chǔ)器中的API函數(shù)的方框圖;圖7描述了用于在一個(gè)高速緩沖存儲(chǔ)器中尋找一個(gè)對(duì)象的API函數(shù)的方框圖;圖8描述了用于從一個(gè)高速緩沖存儲(chǔ)器中刪除一個(gè)對(duì)象的API函數(shù)的方框圖;圖9描述了用于添加一個(gè)從記錄到對(duì)象的依賴關(guān)系的API函數(shù)的方框圖;圖10描述了用于刪除一個(gè)從記錄到對(duì)象的依賴關(guān)系的API函數(shù)的方框圖;圖11描述了當(dāng)一個(gè)記錄改變時(shí)被調(diào)用的一個(gè)API函數(shù)的方框圖;圖12a描述了具有本發(fā)明特點(diǎn)的系統(tǒng)的另一例;圖12b描述了具有本發(fā)明特點(diǎn)的對(duì)象依賴關(guān)系圖的另一例;圖12c描述了圖12a的對(duì)象管理器的一例;圖12d是具有本發(fā)明特點(diǎn)的一個(gè)對(duì)象依賴關(guān)系圖的另一描述;圖13描述了根據(jù)本發(fā)明的一個(gè)實(shí)施例所使用的高速緩沖存儲(chǔ)器的一例;圖14描述了根據(jù)本發(fā)明而使用的目標(biāo)信息塊的一例;圖15描述了根據(jù)本發(fā)明而使用的依賴關(guān)系列表的一例;圖16描述了根據(jù)本發(fā)明而使用的依賴關(guān)系信息塊(DIB)的一例;圖17描述了根據(jù)本發(fā)明的API函數(shù)的另一例;圖18描述了為實(shí)現(xiàn)圖17的API函數(shù)所用方法的方框圖;圖19描述了把一個(gè)對(duì)象的最近版本添加到一個(gè)高速緩沖存儲(chǔ)器中的一個(gè)高速緩沖存儲(chǔ)器API函數(shù)的方框圖;圖20描述了試圖把一個(gè)對(duì)象的一個(gè)版本從一個(gè)高速緩沖存儲(chǔ)器中復(fù)制到另一個(gè)中的API函數(shù)的方框圖;圖21描述了當(dāng)?shù)讓訑?shù)據(jù)變化時(shí)可能被調(diào)用的一個(gè)API函數(shù)的方框圖;圖22描述了響應(yīng)底層數(shù)據(jù)變化通過對(duì)象依賴關(guān)系圖傳播變化所用方法的一部分的方框圖;圖23描述了響應(yīng)底層數(shù)據(jù)變化以“深度”優(yōu)先(depth-first)方式通過對(duì)象依賴關(guān)系圖傳播變化所用方法一部分的方框圖;圖24描述了響應(yīng)底層數(shù)據(jù)變化向一特定圖對(duì)象傳播變化所用方法一部分的方框圖;圖25描述了響應(yīng)底層數(shù)據(jù)變化更新一個(gè)對(duì)象的被高速緩存版本或使其無效所用方法一部分的方框圖;圖26描述了當(dāng)響應(yīng)底層數(shù)據(jù)變化而把一個(gè)或多個(gè)對(duì)象添加到一個(gè)或多個(gè)高速緩沖存儲(chǔ)器中時(shí)為了保持一致性所用方法一部分的方框圖;圖27描述了為創(chuàng)建對(duì)應(yīng)于單一記錄對(duì)象(SRO)的圖節(jié)點(diǎn)所用高速緩沖存儲(chǔ)器API函數(shù)的方框圖;圖28描述了為創(chuàng)建對(duì)應(yīng)于多重記錄對(duì)象(MRO)的圖節(jié)點(diǎn)所用高速緩沖存儲(chǔ)器API函數(shù)的方框圖;圖29a描述當(dāng)記錄變化時(shí)可能被調(diào)用的一個(gè)API函數(shù)的方框圖;圖29b描述了一個(gè)對(duì)象依賴關(guān)系圖的另一例以及它怎樣能被用于向圖對(duì)象傳播變化;圖30a描述用于可剪裁維護(hù)和一致性更新高速緩沖存儲(chǔ)器的具有本發(fā)明特點(diǎn)的系統(tǒng)的方框圖舉例;圖30b描述了圖30a的觸發(fā)監(jiān)視器的更詳細(xì)的舉例,作為一個(gè)主觸發(fā)監(jiān)視器來舉例說明;圖30c描述了觸發(fā)監(jiān)視器一例,作為一個(gè)從屬觸發(fā)監(jiān)視器來舉例說明;圖30d描述了圖30b的send_trigger(發(fā)送觸發(fā)器)API的一例;圖30e描述了根據(jù)本發(fā)明的事務(wù)類型舉例;圖31描述了圖30b的對(duì)象配置塊(ODB)的一例;圖32描述了圖31的高速緩沖存儲(chǔ)器標(biāo)識(shí)(ID)的一例;圖33描述了觸發(fā)監(jiān)視器驅(qū)動(dòng)器和分布管理器的高級(jí)組織和通信路徑的一例;圖34描述了圖33的接收線程邏輯的一例;圖35描述了圖33的輸入任務(wù)分發(fā)器線程邏輯的一例;圖36描述了圖33的高速緩存管理器通信線程邏輯的一例;圖37描述了圖33的對(duì)象發(fā)生器線程邏輯的一例;圖38描述了圖33的分布管理器線程邏輯的一例;圖39描述了圖33的出界(outbound)事務(wù)線程邏輯的一例;圖40描述了用于分析和解釋觸發(fā)器事件的各種擴(kuò)展和變體的舉例;圖41描述了一致性地建立對(duì)具有一個(gè)或多個(gè)高速緩沖存儲(chǔ)器的系統(tǒng)的一組請(qǐng)求所用的邏輯的一例;以及圖42描述了如果接收請(qǐng)求的一組高速緩沖存儲(chǔ)器有多個(gè)成員而用于確定最后鎖住時(shí)間(lastlocktime)的邏輯的一例。確定底層數(shù)據(jù)變化如何影響被高速緩存對(duì)象的方法的詳細(xì)描述術(shù)語表盡管這里所用術(shù)語也包含了字典中的意義,但下述一些術(shù)語的術(shù)語表可能是有用的一個(gè)高速緩沖存儲(chǔ)器(cache)是一個(gè)存儲(chǔ)區(qū)域。它可以在內(nèi)存儲(chǔ)器中,在磁盤上,或者部分在內(nèi)存儲(chǔ)器中部分在磁盤上。對(duì)應(yīng)于高速緩沖存儲(chǔ)器的物理地址或虛擬地址可以是固定的?;蛘?,它們可以隨時(shí)變化。對(duì)高速緩沖存儲(chǔ)器的定義包括(但不限于)-用于萬維網(wǎng)資料的高速緩沖存儲(chǔ)器,如IBM因特網(wǎng)連接服務(wù)器中的代理高速緩沖存儲(chǔ)器或網(wǎng)景導(dǎo)航者(NetscapeNavigator)中的瀏覽器高速緩沖存儲(chǔ)器;-數(shù)據(jù)庫高速緩沖存儲(chǔ)器,如在IBM的DB2數(shù)據(jù)庫中的高速緩沖存儲(chǔ)器;-處理器高速緩沖存儲(chǔ)器,如在IBM的RS/6000計(jì)算機(jī)線中的高速緩沖存儲(chǔ)器;以及-在高級(jí)程序語言中被寫入數(shù)據(jù)的存儲(chǔ)倉庫,這里對(duì)于至少是一部分?jǐn)?shù)據(jù),存儲(chǔ)倉庫程序沒有對(duì)于存儲(chǔ)數(shù)據(jù)區(qū)域的虛擬或物理地址的顯示式控制。高速緩存組合(cacheunion)是系統(tǒng)中所有高速緩沖存儲(chǔ)器的組合。對(duì)象(obiject)是能被存儲(chǔ)在一個(gè)或多個(gè)高速緩沖存儲(chǔ)器中的數(shù)據(jù)。多版本高速緩存(multipleversioncache)是被允許包括同一對(duì)象多個(gè)版本的高速緩沖存儲(chǔ)器。單版本高速緩存(singleversioncache)是只被允許包括同一對(duì)象的一個(gè)版本的高速緩沖存儲(chǔ)器。當(dāng)前版本高速緩存(currentversioncache)是一個(gè)單版本高速緩存,其中任何被高速緩存的對(duì)象的版本必須是當(dāng)前版本。底層數(shù)據(jù)(underlyingdata)包括系統(tǒng)中可能影響一個(gè)或多個(gè)對(duì)象之值的所有數(shù)據(jù)。底層數(shù)據(jù)是系統(tǒng)中所有對(duì)象的超級(jí)集合。復(fù)雜對(duì)象(complexobject)是具有對(duì)底層數(shù)據(jù)的一個(gè)或多個(gè)依賴關(guān)系的對(duì)象。對(duì)象管理器(objectmanager)是一個(gè)程序,它確定底層數(shù)據(jù)的變化如何影響對(duì)象之值。圖G=(V,E)(graphG=(V,E))由有限和非空的頂點(diǎn)V(也稱作節(jié)點(diǎn))集合以及由“頂點(diǎn)對(duì)”構(gòu)成的邊緣E的集合構(gòu)成。如果邊緣是頂點(diǎn)(ν,w)的有序?qū)?,則稱該圖是以ν為邊緣的源而以w為邊緣的靶標(biāo)的被定向圖。多重圖(multigraph)與圖類似。其關(guān)鍵性差別在于在多重圖中的“頂點(diǎn)對(duì)”之間可能存在多個(gè)邊緣。多重圖是圖的超級(jí)集合。加權(quán)圖(weightedgraph)或加權(quán)多重圖(weightedmultigraph)是其中每個(gè)邊緣可能會(huì)帶有一個(gè)稱作權(quán)的數(shù)的圖或多重圖。對(duì)象依賴關(guān)系圖(objectdependencegraph)是一個(gè)被定向多重圖。對(duì)象依賴關(guān)系圖的頂點(diǎn)稱作圖對(duì)象(graphobject)。圖對(duì)象是對(duì)象的超級(jí)集合,可能包括(1)對(duì)象;(2)不是對(duì)象的底層數(shù)據(jù);以及(3)虛擬對(duì)象。這些圖對(duì)象不對(duì)應(yīng)于實(shí)際數(shù)據(jù)。使用它們是為了便于對(duì)數(shù)據(jù)依賴關(guān)系編程。虛擬對(duì)象不象(1)和(2)那樣被頻繁使用。從圖對(duì)象o1到o2的邊緣指示從o1到o2的一個(gè)數(shù)據(jù)依賴關(guān)系(也稱作依賴關(guān)系或依賴性)。這意味著對(duì)o1的改變也會(huì)改變o2。依賴關(guān)系是傳遞性的。這樣,如果a有對(duì)b的數(shù)據(jù)依賴關(guān)系,b有對(duì)c的數(shù)據(jù)依賴關(guān)系,則a有對(duì)c的依賴關(guān)系。圖對(duì)象也可以是關(guān)系對(duì)象(RO)。RO有附屬的關(guān)系分類符。RO的兩個(gè)例子是1.單記錄對(duì)象(SRO);關(guān)系分類符代表單個(gè)記錄;2.多記錄對(duì)象(MRO);關(guān)系分類符代表多重記錄。如果由ROr2代表的所有記錄也由ROr1代表,則稱ROr1包含(包括)ROr2。節(jié)點(diǎn)ν的出發(fā)毗鄰列表(outgoingadjacencylist)是含有其邊緣(ν,w)被包含在E中的全部節(jié)點(diǎn)w的列表。葉節(jié)點(diǎn)(leafnode)是這樣一個(gè)節(jié)點(diǎn),它不是任何邊緣的靶標(biāo)。正常葉節(jié)點(diǎn)(properleafnode)是這樣一個(gè)葉節(jié)點(diǎn),它是至少一個(gè)邊緣的源。最高節(jié)點(diǎn)(maximalnode)是這樣一個(gè)節(jié)點(diǎn),它不是任何邊緣的源。正常最高節(jié)點(diǎn)(propermaximalnode)是這樣一個(gè)最高節(jié)點(diǎn),它是至少一個(gè)邊緣的靶標(biāo)。簡(jiǎn)單依賴關(guān)系圖(simpledependencegraph)是這樣一個(gè)被定向圖,其中每個(gè)節(jié)點(diǎn)為葉節(jié)點(diǎn)或最高節(jié)點(diǎn)。兩個(gè)對(duì)象o1和o2是一致的,如果它們滿足下列條件之一(1)兩個(gè)對(duì)象都是當(dāng)前的;或者(2)在過去的某個(gè)時(shí)候t,這兩個(gè)對(duì)象曾是當(dāng)前的。版本號(hào)(versionnumber)是允許同一對(duì)象的不同版本被唯一識(shí)別所用的數(shù)據(jù)。一個(gè)實(shí)現(xiàn)方式是使用整數(shù)作為版本號(hào),而且對(duì)新創(chuàng)建的當(dāng)前版本賦予的版本號(hào)是前一個(gè)版本的版本號(hào)加1。然而,其他實(shí)現(xiàn)方式也是可能的,而且版本號(hào)不一定必須為數(shù)字。例如,文字串也能用來實(shí)現(xiàn)版本號(hào)。對(duì)象的最新近的版本稱作當(dāng)前版本?,F(xiàn)在參考圖件,圖1a描述了具有本發(fā)明特點(diǎn)的客戶機(jī)-服務(wù)器結(jié)構(gòu)的一例。如圖所示,客戶機(jī)90通過網(wǎng)絡(luò)95向服務(wù)器100發(fā)出請(qǐng)求。服務(wù)器100維持一個(gè)或更多的高速緩沖存儲(chǔ)器2。如傳統(tǒng)作法那樣,服務(wù)器100使用高速緩存2以改善性能和減小為滿足客戶機(jī)90的請(qǐng)求所用的CPU時(shí)間。雖然圖1a所示高速緩存2與單個(gè)服務(wù)器關(guān)聯(lián),但高速緩存2也能保持為跨越多個(gè)服務(wù)器。本行專家也能容易地使本發(fā)明適應(yīng)于不是基于客戶機(jī)-服務(wù)器結(jié)構(gòu)的其他應(yīng)用。在服務(wù)器100上運(yùn)行的一個(gè)應(yīng)用程序97創(chuàng)建對(duì)象,然后把這些對(duì)象(例如那些在受到請(qǐng)求時(shí)不會(huì)引起狀態(tài)改變的動(dòng)態(tài)頁)存儲(chǔ)在一個(gè)或多個(gè)高速緩沖存儲(chǔ)器2中。服務(wù)器100也能是一個(gè)代理服務(wù)器,這里在數(shù)據(jù)庫99中的底層數(shù)據(jù)源和高速緩存2在地理上是分離的。在本實(shí)施例中,對(duì)象是能被存儲(chǔ)在一個(gè)或多個(gè)高速緩存2中的數(shù)據(jù)。這些對(duì)象能由存儲(chǔ)在數(shù)據(jù)庫99上的底層數(shù)據(jù)構(gòu)成。底層數(shù)據(jù)包括系統(tǒng)中可能影響存儲(chǔ)在高速緩存2中的一個(gè)或多個(gè)對(duì)象之值的所有數(shù)據(jù)。底層數(shù)據(jù)是系統(tǒng)中全部對(duì)象的超級(jí)集合。一個(gè)復(fù)雜對(duì)象是對(duì)底層數(shù)據(jù)有一個(gè)或多個(gè)依賴關(guān)系的對(duì)象。再有,讓高速緩存組合中的高速緩存2全部是當(dāng)前版本高速緩存。請(qǐng)回想一下,當(dāng)前版本高速緩存是這樣一個(gè)單一版本高速緩存,其中任何被高速緩存的對(duì)象的版本都必須是當(dāng)前的,而且單一版本高速緩存是只被允許包括同一對(duì)象的一個(gè)版本的高速緩存。根據(jù)本發(fā)明,高速緩存管理器1(它是對(duì)象管理器的一例)確定底層數(shù)據(jù)的變化如何影響對(duì)象之值。雖然圖1a所示高速緩存管理器1駐留在單個(gè)服務(wù)器上,但它也能被分布在多個(gè)服務(wù)器上。高速緩存管理器1最好是具體實(shí)現(xiàn)為計(jì)算機(jī)可執(zhí)行代碼,明確地實(shí)現(xiàn)在一個(gè)程序存儲(chǔ)器裝置上供計(jì)算機(jī)(如服務(wù)器100或客戶機(jī)90)執(zhí)行。本行專家將會(huì)理解,根據(jù)本發(fā)明,高速緩存2、高速緩存管理器1及數(shù)據(jù)庫99能以類似的方式與客戶機(jī)90關(guān)連。高速緩存管理器1提供API(圖4)用于指定一個(gè)被高速緩存的對(duì)象依賴于什么底層數(shù)據(jù),例如數(shù)據(jù)庫記錄。高速緩存管理器1跟蹤這些依賴關(guān)系。每當(dāng)一個(gè)過程修改一個(gè)狀態(tài),而此狀態(tài)會(huì)影響高速緩存中一復(fù)雜對(duì)象之值時(shí),該過程便指定它正在更新的底層數(shù)據(jù)。于是高速緩存管理器1使依賴于正被更新的底層數(shù)據(jù)的所有被高速緩存的對(duì)象變?yōu)闊o效。圖1b描述了具有本發(fā)明特點(diǎn)的對(duì)象依賴關(guān)系圖(G)121’。請(qǐng)注意在本實(shí)施例中的對(duì)象依賴關(guān)系圖(G)121’不如另一實(shí)施例(圖12b)中的那么復(fù)雜。這里,對(duì)象依賴關(guān)系圖121’是一個(gè)簡(jiǎn)單依賴關(guān)系圖,即這樣一個(gè)被定向圖,其中每個(gè)節(jié)點(diǎn)是葉節(jié)點(diǎn)r1…r3或最高節(jié)點(diǎn)co1,co2。請(qǐng)回想,葉節(jié)點(diǎn)是不為任何邊緣靶標(biāo)的節(jié)點(diǎn),而最高節(jié)點(diǎn)是不為任何邊緣之源的節(jié)點(diǎn)。還請(qǐng)注意,每個(gè)路徑的長(zhǎng)度為1,故不需為邊緣指定權(quán)。再有,每個(gè)正常最高節(jié)點(diǎn)(為至少一個(gè)邊緣之靶標(biāo)的最高節(jié)點(diǎn))co1、co2是對(duì)象;而G中的每個(gè)正常葉節(jié)點(diǎn)r1…r4(一個(gè)葉節(jié)點(diǎn)是至少一個(gè)邊緣之源)代表不是對(duì)象的底層數(shù)據(jù)。由每個(gè)正常葉節(jié)點(diǎn)r1…r4所代表的底層數(shù)據(jù)最好是記錄(這些記錄與第二實(shí)施例中所用記錄是不同義的)。由正常最高節(jié)點(diǎn)co1、co2代表的對(duì)象是復(fù)雜對(duì)象。高速緩存管理器1保持一個(gè)代表對(duì)象依賴關(guān)系圖121’的底層數(shù)據(jù)結(jié)構(gòu)(見圖2-3)。應(yīng)用程序97通過一組高速緩存API(見圖4)把對(duì)象依賴關(guān)系圖的結(jié)構(gòu)通知給高速緩存管理器1。該應(yīng)用程序還利用API向?qū)ο蠊芾砥?通告已經(jīng)改變的記錄r1…r4。當(dāng)高速緩存管理器1被通告對(duì)記錄r1…r4的改變時(shí),它必須識(shí)別哪些復(fù)雜對(duì)象co1、co2已被影響并使被識(shí)別出的復(fù)雜對(duì)象從包含它們的任何高速緩存2中刪除(或更新)。高速緩存管理器1能通過檢驗(yàn)G中的邊緣(見圖11)來確定哪些復(fù)雜對(duì)象已經(jīng)改變。例如,假定高速緩存管理器1被通告r1已經(jīng)改變。G121’意味著co1也已改變。高速緩存管理器1必須確保co1從任何包含它的高速緩存2中刪除(或更新)。作為另一個(gè)例子,假定r2已經(jīng)改變。G121’意味著co1和co2也已受影響。這里,高速緩存管理器1必須確保co1和co2都從任何包含它們的高速緩存2中刪除(或更新)。換句話說,基本步驟是在應(yīng)用級(jí)構(gòu)建復(fù)雜對(duì)象,從而使它們依賴于一組記錄。該應(yīng)用程序必須能指出復(fù)雜對(duì)象co1、co2依賴于哪些記錄r1…r4。對(duì)于修改狀態(tài)的方式會(huì)影響被高速緩存的復(fù)雜對(duì)象之值的每個(gè)過程,應(yīng)用程序必須能指出哪些記錄受到影響。這類復(fù)雜對(duì)象被稱作處于正常形式。許多前已存在的萬維網(wǎng)應(yīng)用程序創(chuàng)建的可高速緩存的復(fù)雜對(duì)象已經(jīng)是正常形式的。為了在這些應(yīng)用中使用高速緩存,只需要識(shí)別出復(fù)雜對(duì)象底層的記錄并通過所提供的API建立應(yīng)用和高速緩存之間的接口。最好是,高速緩存管理器1是對(duì)一個(gè)或多個(gè)高速緩存2管理其存儲(chǔ)的一個(gè)長(zhǎng)運(yùn)行過程。然而,本行專家會(huì)容易地使本發(fā)明適應(yīng)于下列之一的高速緩存管理器1.多個(gè)分立過程,其中沒有任何過程在時(shí)間上重疊;2.多個(gè)分立過程,其中有一些可能在時(shí)間上重疊。這包括如此設(shè)計(jì)的多重并發(fā)高速緩存管理器以改善高速緩存系統(tǒng)的吞吐能力。圖1c描述了根據(jù)本發(fā)明的用于高速緩存動(dòng)態(tài)萬維網(wǎng)頁的系統(tǒng)的一例。如所描述的那樣,考慮一個(gè)傳統(tǒng)的萬維網(wǎng)站點(diǎn)100,這里頁面(頁1,…,頁5)是動(dòng)態(tài)地從一個(gè)或多個(gè)數(shù)據(jù)庫99創(chuàng)建的,并存儲(chǔ)在一個(gè)或多個(gè)高速緩存2中。適于本發(fā)明的數(shù)據(jù)庫99和數(shù)據(jù)庫管理系統(tǒng)的一例是由IBM公司以商標(biāo)DB2銷售的那種。這里,動(dòng)態(tài)萬維網(wǎng)頁(頁1,…頁9)是對(duì)象,而底層數(shù)據(jù)(表/記錄)包括數(shù)據(jù)庫99的一些部分。根據(jù)本發(fā)明,高速緩存管理器1提供API(圖4),這些API允許應(yīng)用程序97指定被高速緩存的對(duì)象所依賴的記錄。高速緩存管理器1跟蹤這些依賴關(guān)系。每當(dāng)一應(yīng)用程序97修改記錄或得知會(huì)影響高速緩存中的復(fù)雜對(duì)象之值的記錄發(fā)生變化,應(yīng)用程序97便把已被更新的記錄通告給高速緩存管理器1。于是,高速緩存管理器1使依賴于已經(jīng)改變的記錄的所有被高速緩存的對(duì)象無效或使其更新。例如,考慮圖1C中描述的HTML頁(頁1…頁5)。這些HTML頁是復(fù)雜對(duì)象,它們是由數(shù)據(jù)庫99構(gòu)建的并存儲(chǔ)于高速緩存3。每個(gè)HTML頁可能對(duì)一個(gè)或多個(gè)記錄有依賴關(guān)系,而這些記錄是數(shù)據(jù)庫的若干部分,表示為表1、表2、…表6。這些表和頁之間的對(duì)應(yīng)關(guān)系能由散列表(hashtable)和記錄列表19來維持。例如,如果高速緩存管理器1被告知表1的變化T1,它會(huì)使頁1無效(或更新)。類似地,如果高速緩存管理器1被告知表2的變化T2,它會(huì)使頁1、頁2、頁3無效(或更新)。圖2描述了高速緩存2的一例。如所描述的那樣,每個(gè)高速緩存2最好有4個(gè)存儲(chǔ)區(qū)一個(gè)目錄3保持關(guān)于被高速緩存對(duì)象的信息;一個(gè)對(duì)象存儲(chǔ)器4用于存儲(chǔ)若干對(duì)象6;輔助狀態(tài)信息5,它包括其他狀態(tài)信息(如由高速緩存維持的統(tǒng)計(jì)信息);以及散列表19,它把關(guān)于記錄的信息存儲(chǔ)在散列表?xiàng)l目25中。在一個(gè)最佳實(shí)施例中,散列表?xiàng)l目25包含記錄標(biāo)識(shí)(ID)12和對(duì)象列表8,它包括對(duì)象列表,即對(duì)象標(biāo)識(shí)(id)9,其值依賴的記錄可能是數(shù)據(jù)庫99的一部分。然而,本發(fā)明還允許其他類型信息存儲(chǔ)到散列表?xiàng)l目中。散列表的目的是提供一種有效的方法來找出關(guān)于特定表/記錄的信息。最好是散列表中以記錄ID12作為關(guān)鍵字。散列表在技術(shù)上是公知的(例如參見“計(jì)算機(jī)算法的設(shè)計(jì)和分析”,Aho,Hopcroft,Ullman,Addison-Wesley,1974)。散列表為本發(fā)明提供了一種有效的數(shù)據(jù)結(jié)構(gòu)。然而,本發(fā)明與廣泛的其他數(shù)據(jù)結(jié)構(gòu)兼容,并不限于使用散列表。目錄3包括存儲(chǔ)在高速緩存中的每個(gè)對(duì)象6的對(duì)象信息塊(OIB)10。OIB10的組份之一是記錄列表11(圖3),它用于存儲(chǔ)標(biāo)識(shí)記錄r1…r4的記錄ID12,這些記錄r1…r4是與復(fù)雜對(duì)象co1、co2相關(guān)聯(lián)的。這里,復(fù)雜對(duì)象是存儲(chǔ)在高速緩存2中的動(dòng)態(tài)萬維網(wǎng)頁(頁1…頁5),而記錄可以是數(shù)據(jù)庫99的一部分。雖然該最佳實(shí)施例使用文字串作為記錄ID,其他方法也是兼容的。應(yīng)用程序通過一組API函數(shù)與高速緩存管理器1通信。根據(jù)本發(fā)明的API舉例示于圖4。對(duì)于本行專家,能在本發(fā)明的精神和范圍內(nèi)以直接的方式實(shí)現(xiàn)添加許多API。如所描述的那樣,舉例的API是cache_object(object_id,object,cache_id)(高速緩存對(duì)象(對(duì)象標(biāo)識(shí),對(duì)象,高速緩存標(biāo)識(shí)))410在關(guān)鍵字otject_id9下把由cache_id標(biāo)識(shí)的對(duì)象6存儲(chǔ)在由cache_id標(biāo)識(shí)的高速緩存2中(圖2);重寫有相同關(guān)鍵字的任何先前的對(duì)象6。本發(fā)明與object_id,object及cache_id的廣泛多樣的類型兼容。在此最佳實(shí)施例中,對(duì)象6可以有若干類型,object_id是字節(jié)串,cache_id是字符串。這里,雖然最好不允許具有同一關(guān)鍵字的多個(gè)項(xiàng)同時(shí)存在于同一高速緩存,然而,本行專家不難把本發(fā)明用于在同一高速緩存中能同時(shí)存在具有同一關(guān)鍵字的多個(gè)項(xiàng)的場(chǎng)合。lookup_object(object_id,cache_id)(查尋對(duì)象(對(duì)象標(biāo)識(shí),高速緩存標(biāo)識(shí)))415以關(guān)鍵字object_id9查尋高速緩存2中由cache_id標(biāo)識(shí)的對(duì)象6。如果存在任何這種對(duì)象,則把它返回給應(yīng)用程序。delete_obiect(object_id,cache_id)(刪除對(duì)象(對(duì)象標(biāo)識(shí),高速緩存標(biāo)識(shí)))420以關(guān)鍵字object_id9查尋高速緩存中由cache_id標(biāo)識(shí)的對(duì)象6。如果存在任何這種對(duì)象,則刪除它。add_dependency(object_id,cache_id,record_id)(添加依賴關(guān)系(對(duì)象標(biāo)識(shí),高速緩存標(biāo)識(shí),記錄標(biāo)識(shí)))430以關(guān)鍵字object_id9在由cache_id標(biāo)識(shí)的高速緩存2中查找對(duì)象6。如果存在任何這類對(duì)象6,而且在對(duì)象6和與這個(gè)record_id相關(guān)聯(lián)的由record_id12標(biāo)識(shí)的記錄之間沒有依賴關(guān)系,則添加這個(gè)依賴關(guān)系。delete-dependency(object_id,cache_id,record_id)(刪除依賴關(guān)系(對(duì)象標(biāo)識(shí),高速緩存標(biāo)識(shí),記錄標(biāo)識(shí)))440以關(guān)鍵字object_id9在由cache_id標(biāo)識(shí)的高速緩存中查尋對(duì)象6。如果存在任何這類對(duì)象6,而且在對(duì)象6和由record_id12標(biāo)識(shí)的記錄之間存在一個(gè)依賴關(guān)系,則刪除這個(gè)依賴關(guān)系。invalidate_record(cache_id,record_id)(使記錄無效(高速緩存標(biāo)識(shí),記錄標(biāo)識(shí)))450從由cache_id標(biāo)識(shí)的高速緩存2中刪除依賴于由record_id標(biāo)識(shí)的記錄的所有高速緩存對(duì)象。show_dependent_objects(cache_id,record_id)(顯示依賴對(duì)象(高速緩存標(biāo)識(shí),記錄標(biāo)識(shí)))460對(duì)于由cache_id標(biāo)識(shí)的高速緩存2中依賴于由record_id標(biāo)識(shí)的記錄的所有對(duì)象返回一個(gè)object_id9的列表,這個(gè)函數(shù)可以通過返回散列表?xiàng)l目25的對(duì)象列表8來實(shí)現(xiàn),這個(gè)散列表?xiàng)l目25是對(duì)應(yīng)于由record_id標(biāo)識(shí)的記錄的。也能返回一個(gè)狀態(tài)變量來指出是否沒有發(fā)現(xiàn)高速緩存2或散列表?xiàng)l目25。show_associated_records(cache_id,object_id)(顯示相關(guān)記錄(高速緩存標(biāo)識(shí),對(duì)象標(biāo)識(shí)))470對(duì)于對(duì)象6(在由cache_id標(biāo)識(shí)的高速緩存2中的由object_id標(biāo)識(shí)的對(duì)象)所依賴的所有記錄返回一個(gè)記錄標(biāo)識(shí)12的列表。這個(gè)函數(shù)能通過返回記錄列表11(圖3)來實(shí)現(xiàn),該記錄列表11是為cache_id標(biāo)識(shí)的高速緩存2中由object_id標(biāo)識(shí)的對(duì)象6建立的。也能返回一個(gè)狀態(tài)變量來指出是否沒有發(fā)現(xiàn)高速緩存或?qū)ο?。圖5描述了高速緩存管理器1邏輯一例。如所描述的那樣,在步驟1010,高速緩存管理器收到一個(gè)來自應(yīng)用程序的命令(圖4)。在步驟1020,高速緩存管理器讀出這個(gè)命令(圖4)。并根據(jù)這個(gè)命令調(diào)用下文描述的不同邏輯1100…1600。圖6描述了對(duì)于cache_object(object_id,object,cache_id)410命令的高速緩存管理器邏輯1200。如所描述的那樣,在步驟1200,高速緩存管理器1確定該cache_id參數(shù)是否指定一個(gè)有效的高速緩存2。如果不是,則在步驟1245設(shè)置適當(dāng)?shù)臓顟B(tài)變量以回送給應(yīng)用程序。如果cache_id指定了一個(gè)有效的高速緩存2,則最好是把高速緩存2鎖住,以避免多個(gè)過程并發(fā)訪問該高速緩存。以這種方案來保持其一致性。專門專家將會(huì)理解,其他鎖住方式可以使用,以提供更高級(jí)別的并發(fā)性。除了在最佳實(shí)施例中所用的例子外,本發(fā)明與廣泛多樣的傳統(tǒng)鎖住方案兼容。在步驟1205,高速緩存管理器1通過檢驗(yàn)?zāi)夸?(圖2)來查尋對(duì)象6。如果找到了對(duì)象6的先前副本,則在步驟1215對(duì)象6的OIB10被更新,而且在對(duì)象存儲(chǔ)器4中的對(duì)象6的老版本被新版本替代并適當(dāng)設(shè)置狀態(tài)變量。如果在步驟1205中未發(fā)現(xiàn)對(duì)象6的一個(gè)先前副本,則在步驟1210為對(duì)象6建立新的OIB10,初始化,并存儲(chǔ)在目錄3中。高速緩存管理器1還把對(duì)象6存儲(chǔ)在對(duì)象存儲(chǔ)器4中并適當(dāng)改變狀態(tài)變量。在步驟1230,高速緩存被解鎖從而允許其他過程對(duì)其更新。在步驟1240,指示命令結(jié)果的狀態(tài)變量被回送到應(yīng)用程序。于是過程返回步驟1010(圖5)。圖7描述了lookup_object(object_id,cache_id)415命令的邏輯的舉例。如所描述的那樣,在步驟1600,高速緩存管理器1確定cache_id參數(shù)是否指定了一個(gè)有效的高速緩存2。如果不是,則在步驟1640設(shè)置適當(dāng)?shù)臓顟B(tài)變量并在步驟1680回送給應(yīng)用程序。如果cache_id指定了一個(gè)有效的高速緩存,則在步驟1610使高速緩存2被鎖住。在步驟1620,高速緩存管理器1通過檢驗(yàn)?zāi)夸?(圖2)來查尋對(duì)應(yīng)于object_id參數(shù)的對(duì)象6。如果未找到對(duì)象6,則在步驟1650對(duì)高速緩存2解鎖;在步驟1670設(shè)置狀態(tài)變量并在步驟1680返回應(yīng)用程序。如果在步驟1620找到了對(duì)象6,則在步驟1630對(duì)高速緩存2解鎖;并在步驟1660把對(duì)象6回送給應(yīng)用程序。圖8描述了delete_object(object_id,cache_id)420命令。如所描述的那樣,在步驟1100,高速緩存管理器1確定對(duì)應(yīng)于cache_id參數(shù)的高速緩存2是否有效。如果無效,則在步驟1103適當(dāng)設(shè)置狀態(tài)變量并在步驟1150將狀態(tài)變量回送給應(yīng)用程序。如果在步驟1100,cache_id指定的高速緩存是有效的,則在步驟1105使高速緩存被鎖住。在步驟1107,高速緩存管理器1通過檢驗(yàn)?zāi)夸?(圖2)來查尋對(duì)應(yīng)于object_id參數(shù)的對(duì)象6。如果對(duì)象6未被找到,則在步驟1108使高速緩存解鎖;在步驟1109設(shè)置狀態(tài)變量;并在步驟1150把狀態(tài)參數(shù)回送給應(yīng)用程序。如果在步驟1107找到了對(duì)象6,則在步驟1110由高速緩存管理器1刪除該對(duì)象所關(guān)聯(lián)的記錄列表11(圖3)并更新相應(yīng)的對(duì)象列表8(圖2)。高速緩存管理器1掃描對(duì)應(yīng)于對(duì)象6的記錄列表11(圖3)的每個(gè)記錄ID12。請(qǐng)注意,在記錄列表11上的每個(gè)記錄ID12有一個(gè)相應(yīng)的對(duì)象列表8(圖2)。對(duì)應(yīng)于被刪除對(duì)象6的指向?qū)ο骾d(對(duì)象標(biāo)識(shí))9(圖2)的指針均被從所有這類對(duì)象列表8中去掉。如果這樣做的結(jié)果造成任何對(duì)象列表8變空,則相應(yīng)的散列表?xiàng)l目25也被刪除。在記錄列表11中的每個(gè)元素被檢驗(yàn)過之后,它可被刪除。在步驟1120,對(duì)象6被從對(duì)象存儲(chǔ)器4中刪除。在步驟1130,相應(yīng)的OIB10被刪除。請(qǐng)注意,步驟1120能與步驟1110和1130并發(fā)完成或在步驟1110及1130之前完成。在步驟1140,高速緩存被解鎖,并在1150把狀態(tài)變量回送給應(yīng)用程序。圖9描述了add_dependency(object_id,cache_id,record_id)430命令的邏輯的舉例。如所描述的那樣,在步驟1300,高速緩存管理器1檢驗(yàn)cache-id參數(shù)是否指定了一個(gè)有效的高速緩存2。如果不是,則在步驟1302設(shè)置適當(dāng)?shù)臓顟B(tài)參數(shù)并在步驟1360回送給應(yīng)用程序。如果在步驟1300確認(rèn)cache_id指定了一個(gè)有效的高速緩存,則在步驟1305使高速緩存2被鎖住。在步驟1310,高速緩存管理器1通過檢驗(yàn)?zāi)夸?(圖2)來查尋對(duì)應(yīng)于object_id的對(duì)象6。如果在步驟1310未找到對(duì)象6,則在步驟1315高速緩存2被解鎖;在步驟1317設(shè)置狀態(tài)變量,并在步驟1360把適當(dāng)?shù)臓顟B(tài)變量回送給應(yīng)用程序。如果在步驟1310找到了對(duì)象6,則在步驟1320高速緩存管理器1檢驗(yàn)記錄列表11(圖3),看對(duì)象6和由record_id指定的記錄之間是否已經(jīng)存在關(guān)聯(lián)(即依賴關(guān)系信息)。另一作法是,能確定對(duì)應(yīng)于record_id的記錄是否有一個(gè)散列表?xiàng)l目25,如果有此條目,則在對(duì)象列表8上查尋object_id9。如果在步驟1320,存在對(duì)對(duì)象的依賴關(guān)系,則在步驟1325使高速緩存2被解鎖;在步驟1327設(shè)置適當(dāng)?shù)臓顟B(tài)變量;并在步驟1360將適當(dāng)?shù)臓顟B(tài)變量回送給應(yīng)用程序。如果在步驟1320沒有找到對(duì)對(duì)象的依賴關(guān)系,則在步驟1330把一個(gè)object_id9添加到對(duì)該記錄的對(duì)象列表8。如果需要,則為該記錄創(chuàng)建新的散列表?xiàng)l目25及對(duì)象列表8。請(qǐng)注意,步驟1340能與步驟1330并發(fā)執(zhí)行或在步驟1330之前執(zhí)行。在步驟1350使高速緩存解鎖,并在步驟1360將狀態(tài)變量回送給應(yīng)用程序。圖10描述了delete_dependency(object_id,cache_id,record-id)440命令。如所描述的那樣,在步驟1400,高速緩存管理器1確定由cache_id指定的高速緩存2是否有效。如果無效,則在步驟1402設(shè)置適當(dāng)?shù)臓顟B(tài)變量并在步驟1460將狀態(tài)變量回送給應(yīng)用程序。在步驟1400,如果確認(rèn)cache_id指定了一個(gè)有效的高速緩存,則在步驟1405使該高速緩存被鎖住。在步驟1410,高速緩存管理器1通過檢驗(yàn)?zāi)夸?(圖2)來查尋對(duì)應(yīng)于object_id的對(duì)象6。如果在步驟1410未找到對(duì)象6,則在步驟1412使高速緩存2解鎖;在步驟1415設(shè)置狀態(tài)變量并在步驟1460將狀態(tài)變量回送給應(yīng)用程序。如果在步驟1410找到了對(duì)象6,則在步驟1420高速緩存管理器1檢驗(yàn)記錄到表11(圖3),看對(duì)象6和由record_id指定的記錄之間是否已經(jīng)存在關(guān)聯(lián)(即依賴關(guān)系信息)。另一種作法是,能確定對(duì)應(yīng)于record_id的記錄是否有散列表?xiàng)l目25,如果有,則在對(duì)象列表8上查尋object_id9。如果在步驟1420未找到依賴關(guān)系,則在步驟1422使高速緩存2解鎖;在步驟1425設(shè)置適當(dāng)?shù)臓顟B(tài)變量;并在步驟1460把適當(dāng)?shù)臓顟B(tài)變量回送給應(yīng)用程序。如果在步驟1420找到了對(duì)該對(duì)象的一個(gè)依賴關(guān)系,則在步驟1430對(duì)該記錄從對(duì)象列表8中刪除object_id9。如果這樣做使得對(duì)象列表變?yōu)榭毡恚瑒t刪除對(duì)于該記錄的散列表?xiàng)l目25。在步驟1440,對(duì)于對(duì)象6,從記錄列表11(圖3)中刪除record_id12。請(qǐng)注意,步驟1440能與步驟1430并發(fā)執(zhí)行或在步驟1430之前執(zhí)行。在步驟1450使高速緩存解鎖并在步驟1460把狀態(tài)變量回送給應(yīng)用程序。圖11描述了invalidate_record(cache_id,record_id)450命令的邏輯的一例。如所描述的那樣,在步驟1500,高速緩存管理器1確定cache_id參數(shù)指定的高速緩存2是否有效。如果高速緩存無效,則在步驟1502設(shè)置適當(dāng)?shù)臓顟B(tài)變量并在步驟1550將狀態(tài)變量回送給應(yīng)用程序。如果在步驟1500,高速緩存管理器1確定由cache_id參數(shù)指定的高速緩存是有效的,則在步驟1505使高速緩存2被鎖住。在步驟1510,高速緩存管理器通過檢查與record_id關(guān)聯(lián)的記錄是否有散列表?xiàng)l目25(圖2)來確定是否有任何對(duì)象6的值依賴于該記錄。如果對(duì)于該記錄未找到散列表?xiàng)l目25,則在步驟1515使高速緩存解鎖并在步驟1517設(shè)置狀態(tài)變量。如果在步驟1510找到了對(duì)于該記錄的散列表?xiàng)l目25,則在步驟1520高速緩存管理器1對(duì)該記錄掃描對(duì)象列表8。在對(duì)象列表8中有對(duì)象ID9的每個(gè)對(duì)象6被從高速緩存中刪除。由于每個(gè)對(duì)象9被刪除,從其他對(duì)象列表8到對(duì)象6的所有訪問關(guān)系也被刪除。如果任何這種訪問關(guān)系的刪除導(dǎo)致任何空的對(duì)象列表的話,則相應(yīng)的散列表?xiàng)l目25也被刪除。在檢驗(yàn)了與record_id12(對(duì)應(yīng)于record_id參數(shù))關(guān)聯(lián)的對(duì)象列表8中的每個(gè)元素之后,該元素可被刪除。在步驟1530,對(duì)該記錄的散列表?xiàng)l目25被刪除。在步驟1540高速緩存被解鎖,并在步驟1550將狀態(tài)變量回送給應(yīng)用程序。本行專家會(huì)實(shí)現(xiàn)對(duì)invalidate_record函數(shù)的直接擴(kuò)展,使其更新一個(gè)或多個(gè)依賴于record_id參數(shù)的對(duì)象,而不是使這些對(duì)象失效。步驟1099代表高速緩存管理器可能會(huì)處理的其他命令。本行專家將會(huì)理解,在本發(fā)明的范圍和精神內(nèi)有大量擴(kuò)展和變體。例如,一個(gè)變體是允許高速緩存管理器1在對(duì)象6被高速緩存之前和在對(duì)象6已被從高速緩存中刪除之后這兩種場(chǎng)合保持和更新關(guān)于對(duì)象6的OIB10(圖2)。利用這種做法,當(dāng)對(duì)象6從高速緩存中被刪除時(shí),便不需要對(duì)于對(duì)象6刪除記錄列表11和從所有對(duì)象列表8中去掉對(duì)象6。以這種方式,當(dāng)對(duì)象6不在高速緩存中時(shí),依賴關(guān)系信息也能被保持甚至被更新。另一個(gè)變體是在任何對(duì)象添加到對(duì)象列表8之前和在對(duì)象列表8變空之后這兩種情況下都允許高速緩存管理器1去維持和更新一個(gè)記錄的散列表?xiàng)l目25。換句話說,即在高速緩存管理器獲知對(duì)該記錄的任何依賴關(guān)系之前和在對(duì)高速緩存管理器所獲知的記錄的所有依賴關(guān)系都變?yōu)檫^時(shí)之后。如果散列表?xiàng)l目25中除了記錄ID12和對(duì)象列表8外還包括其他信息,則這種變體特別有價(jià)值。另一實(shí)施例圖12a描述了具有本發(fā)明特點(diǎn)的系統(tǒng)的另一例。在本實(shí)施例以及前一個(gè)實(shí)施例中,本發(fā)明能用于在傳統(tǒng)的客戶機(jī)-服務(wù)器環(huán)境中改善服務(wù)器應(yīng)用的性能。本行專家還能容易地使本發(fā)明適應(yīng)于不基于客戶機(jī)-服務(wù)器的其他應(yīng)用。如所描述的那樣,一個(gè)客戶機(jī)-服務(wù)器結(jié)構(gòu),其中的客戶機(jī)90通過網(wǎng)絡(luò)95與服務(wù)器100通信。服務(wù)器100維持一個(gè)或多個(gè)高速緩沖存儲(chǔ)器2’。如傳統(tǒng)的那樣,服務(wù)器100使用高速緩存2’來改善性能和減少為滿足客戶機(jī)請(qǐng)求所用的CPU時(shí)間。雖然圖12顯示的高速緩存2’關(guān)聯(lián)于單個(gè)服務(wù)器,但高速緩存2’也能保持跨越多個(gè)服務(wù)器。在服務(wù)器100上運(yùn)行的應(yīng)用創(chuàng)建對(duì)象并把這些對(duì)象存儲(chǔ)在一個(gè)或多個(gè)高速緩存2’上。該系統(tǒng)還能形成這樣的結(jié)構(gòu),使數(shù)據(jù)庫99中的底層數(shù)據(jù)與高速緩存2’在地理上分開。在本實(shí)施例中,對(duì)象是能被存于一個(gè)或多個(gè)高速緩存2’中的數(shù)據(jù)。這些對(duì)象能由存儲(chǔ)在數(shù)據(jù)庫99上的底層數(shù)據(jù)來構(gòu)建。底層數(shù)據(jù)是系統(tǒng)中能影響一個(gè)或多個(gè)對(duì)象之值的所有數(shù)據(jù)。底層數(shù)據(jù)是系統(tǒng)中所有對(duì)象的超級(jí)集合。根據(jù)本發(fā)明,對(duì)象管理器120最好是作為明確地駐留在計(jì)算機(jī)可讀介質(zhì)中的計(jì)算機(jī)可執(zhí)行代碼(“程序”)來駐留供計(jì)算機(jī)(如服務(wù)器100或客戶機(jī)90)上執(zhí)行。對(duì)象管理器幫助確定底層數(shù)據(jù)的變化如何影響高速緩存2’中的對(duì)象之值。雖然圖12a顯示對(duì)象管理器駐留在單個(gè)服務(wù)器上,但它也可是分布于多個(gè)服務(wù)器上。對(duì)象管理器最好是一個(gè)長(zhǎng)運(yùn)行過程,用于管理一個(gè)或多個(gè)高速緩存2’的存器?!案咚倬彺妗边@個(gè)詞是一個(gè)很通用的術(shù)語,除了高速緩存的傳統(tǒng)意義外,還能包括任何應(yīng)用(例如一個(gè)客戶機(jī)90的應(yīng)用)。本行專家能容易地使本發(fā)明適應(yīng)用適用于下列之一的對(duì)象管理器1.多個(gè)分立過程,其中沒有任何過程在時(shí)間上重疊;2.多個(gè)分立過程,其中有一些可能在時(shí)間上重疊。這包括如此設(shè)計(jì)的多重并發(fā)對(duì)象管理器以改善系統(tǒng)的吞吐能力。圖12b描述了具有本發(fā)明特點(diǎn)的一個(gè)對(duì)象依賴關(guān)系圖121的一例。對(duì)象依賴關(guān)系圖121(簡(jiǎn)寫為G)代表圖對(duì)象gobj1…gobjn之間的數(shù)據(jù)依賴關(guān)系。這里gobj1,…,gobjn代表不同的圖對(duì)象,而圖中的邊緣e代表數(shù)據(jù)依賴關(guān)系。例如,從gobj1到gobj5的邊緣表明如果gobj1已經(jīng)改變則gobj5也已經(jīng)改變。邊緣的權(quán)w指示一個(gè)對(duì)象(它是邊緣的源)的改變對(duì)該邊緣的靶標(biāo)對(duì)象的影響程度如何。例如,gobj1的改變意味著gobj5中的改變要比由于gobj2的改變所造成的gobj5的改變顯著得多。這是因?yàn)閺膅obj1到gobj5的邊緣e的權(quán)w5倍于從gobj2到gobj5的邊緣e的權(quán)w。對(duì)象管理器120負(fù)責(zé)維持底層數(shù)據(jù)結(jié)構(gòu),這些結(jié)構(gòu)代表對(duì)象依賴關(guān)系圖(見圖12a-c及圖16)。應(yīng)用程序通過一組API(見圖18a)把對(duì)象依賴關(guān)系圖結(jié)構(gòu)通告給對(duì)象管理器。該應(yīng)用還利用API向?qū)ο蠊芾砥魍ǜ嬉呀?jīng)改變的底層數(shù)據(jù)。當(dāng)對(duì)象管理器被告知底層數(shù)據(jù)改變時(shí),它必須確定哪些其他對(duì)象已改變并把這些改變通告給高速緩存2’。它通過追循對(duì)象依賴關(guān)系圖(見圖21)中的邊緣來確定哪些其他對(duì)象已經(jīng)改變。例如,假定對(duì)象管理器120被告知gobj1已改變。通過追循對(duì)象依賴關(guān)系圖121中從gobj1出發(fā)的邊緣,它確定gobj5和gobj7也已改變。作為另一個(gè)例子,假定對(duì)象管理器被告知gobj7已改變。由于在對(duì)象依賴關(guān)系圖中沒有以gobj7為源的邊緣,故對(duì)象管理器得出的結(jié)論是沒有其他對(duì)象受到影響。圖12c描述具有本發(fā)明特點(diǎn)的對(duì)象管理器120的一例。如圖中所描述的那樣,對(duì)象管理器120包括幾個(gè)存儲(chǔ)區(qū)域1.由多個(gè)依賴關(guān)系信息塊(DIB)128實(shí)現(xiàn)的對(duì)象依賴關(guān)系圖G121(見圖12d)。本行專家將會(huì)理解,能用多種數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)DIB。最好是使用傳統(tǒng)的散列表,這里的DIB由object_id(對(duì)象標(biāo)識(shí))160作為索引。例如,在“計(jì)算機(jī)算法的設(shè)計(jì)與分析”(Aho,Hopcroft,Ullman,Addison-Wesley,1974)一文中描述了散列表。2.多重記錄樹(MRT)122(見圖27-28)。3.單個(gè)記錄樹(SRT)123(見圖27-28)。4.輔助狀態(tài)信息124,它包括但不限于下述內(nèi)容a.num_updates125計(jì)數(shù)器num_updates125是由對(duì)象管理器維持的,用于跟蹤對(duì)象管理器已經(jīng)通過該圖傳播的更新的次數(shù)。b.一致性堆棧128.5用于在更新過程中保持一致性。c.關(guān)系信息129(見圖27-28)。5.程序邏輯126。圖13描述了由每個(gè)高速緩存127維持的存儲(chǔ)區(qū)域的舉例。每個(gè)高速緩存有一個(gè)標(biāo)識(shí)它的cache_id135字段。有3個(gè)主要存儲(chǔ)區(qū)1.目錄130保持關(guān)于對(duì)象的信息。目錄130包括多個(gè)對(duì)象信息塊(OIB)10’。在對(duì)象離開高速緩存之后,關(guān)于該對(duì)象的信息可以保留在一個(gè)OIB10’中(圖14)。本行專家將會(huì)理解,可以用多種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)OIB。最好是,使用傳統(tǒng)的散列表,其中由object_id160作為OIB的索引。2.對(duì)象存儲(chǔ)區(qū)132這里存儲(chǔ)高速緩存中包含的對(duì)象。3.輔助狀態(tài)信息包括其他狀態(tài)信息,例如cache_id135。圖14描述了OIB10’的一例。OIB最好包括如下內(nèi)容object_id(對(duì)象標(biāo)識(shí))160為了下文的討論,假定一個(gè)對(duì)象有一對(duì)象標(biāo)識(shí)object_ido1;version_num(版本號(hào))141允許對(duì)象管理器唯一地識(shí)別同一對(duì)象的不同版本;timestamp(時(shí)間標(biāo)記)142用以指明該對(duì)象被計(jì)算出的時(shí)間距現(xiàn)在有多近的一個(gè)數(shù);actual_weight(實(shí)際權(quán))143從圖對(duì)象o2到o1的所有邊緣的權(quán)之和,用于使被高速緩存的o1版本與o2的當(dāng)前版本一致;以及dep_list(依賴關(guān)系列表)144代表對(duì)對(duì)象o1依賴關(guān)系的列表。圖15描述了dep_list144元素的舉例。如所描述的那樣,每個(gè)列表最好包括object_id160代表一個(gè)圖對(duì)象o2,它有到o1的依賴關(guān)系邊緣,即o2是源,而o1是靶標(biāo);weight_act(權(quán)作用數(shù))152代表o2的最近版本與o1的被高速緩存版本的一致性程度的一個(gè)數(shù)。本最佳實(shí)施例使用值0(完全不一致)或依賴關(guān)系信息塊(DIB)128中的相應(yīng)邊緣的權(quán)(見圖16)(完全一致)。一種直接的擴(kuò)展將允許使用這兩個(gè)極值之間的數(shù)來代表不一致性程度;以及version_num(版本號(hào))153與o1的被高速緩存版本相一致的o2版本號(hào)。圖16描述了圖12中依賴關(guān)系信息塊(DIB)的一例。如所描述的那樣,DIB128最好包括如下字段object_id(對(duì)象標(biāo)識(shí))160被應(yīng)用程序用來識(shí)別圖對(duì)象。為了下文中的討論,假定一個(gè)圖對(duì)象有一object_ido1;version_num(版本號(hào))161該圖對(duì)象的當(dāng)前版本的版本號(hào);timestamp(時(shí)間標(biāo)記)162該圖對(duì)象的當(dāng)前版本的時(shí)間標(biāo)記;storage_list(存儲(chǔ)列表)163(用于是對(duì)象的圖對(duì)象)包含該對(duì)象的所有高速緩存的cache_id(高速緩存標(biāo)識(shí))的列表;incoming_dep(進(jìn)入依賴)164具有到o1的依賴關(guān)系邊緣的所有圖對(duì)象o2的(object_id160,weight165)對(duì)的列表。權(quán)165代表該依賴關(guān)系的重要性。例如,較大的數(shù)可代表更重要的依賴關(guān)系;outgoing_dep(發(fā)出依賴)166存在從o1出發(fā)的依賴關(guān)系邊緣的所有object_id的列表;sum_weight(權(quán)之和)167進(jìn)入o1的所有依賴關(guān)系邊緣的權(quán)之和;threshold_weight(權(quán)閾值)168(用于是對(duì)象的圖對(duì)象)代表何時(shí)一個(gè)對(duì)象應(yīng)被認(rèn)為是高度過時(shí)的對(duì)象的一個(gè)數(shù)。每當(dāng)一個(gè)OIB10’(圖14)中的actual_weight143落到底于該對(duì)象的threshold_weight字段時(shí),該對(duì)象被認(rèn)為是高度過時(shí)的并應(yīng)使其從高速緩存中失效或更新。consistency_list(一致性列表)169(用于是對(duì)象的圖對(duì)象)對(duì)應(yīng)于那些必須與當(dāng)前對(duì)象保持一致的其他對(duì)象的object_id160的列表。最好是,只在同一高速緩存中的對(duì)象之間實(shí)施一致性要求。一種直接的擴(kuò)展會(huì)在多個(gè)高速緩存之間實(shí)施一致性要求。另一種直接擴(kuò)展會(huì)是要求每當(dāng)object_id進(jìn)/出高速緩存時(shí)在列表169上的所有對(duì)象也要進(jìn)/出該高速緩存;latest_object(最新對(duì)象)1601(用于是對(duì)象的圖對(duì)象)指向?qū)ο笞钚掳姹镜闹羔?,如果?duì)象管理器未得知這樣的副本,則該指針為“空”(null)。這個(gè)字段允許一個(gè)對(duì)象在多個(gè)高速緩存中被更新而不必每次都重新計(jì)算它的值;relational_string(關(guān)系串)1602如果該圖對(duì)象不是一個(gè)關(guān)系對(duì)象,則該字段為“空”。否則,該字段為如下形式SRO的relationname(關(guān)系名)(25,30)和MRO的relation_name(>=50)。如果relational_string1602非“空”,下列字段才是有關(guān)聯(lián)的;multiple_records(多重記錄)1603如果圖對(duì)象是一多重記錄對(duì)象(MRO)則為真,如果它是單記錄對(duì)象(SRO)則為假;如果multiple_records1603為真,下列字段才是有關(guān)聯(lián)的mro_depWeight(MRO依賴關(guān)系權(quán)重)1064賦予另一關(guān)系對(duì)于至o1的隱式依賴關(guān)系的權(quán)值;和mro_threshold_increment(MRO閾值增量)1605對(duì)于每個(gè)對(duì)o1的隱式依賴關(guān)系,threshold_weight應(yīng)被加一增量。再參考圖12,目標(biāo)管理器最好也維持一個(gè)計(jì)數(shù)器num_updates(計(jì)數(shù)更新)125(初始化為零),它跟蹤目標(biāo)管理器通過該圖傳播的更新次數(shù)。目標(biāo)管理器還維持一個(gè)稱作一致性堆棧128.5(圖12c)的數(shù)據(jù)結(jié)構(gòu)(初始為空的),它用于保留高速緩存中各對(duì)象之間的一致性。應(yīng)用程序97最好是通過一組API函數(shù)與對(duì)象管理器通信。圖17描述了根據(jù)本發(fā)明的若干API舉例。本行專家會(huì)理解,其他API也能實(shí)現(xiàn),作為本發(fā)明的直接延伸。圖18描述了處理不同API函數(shù)的目標(biāo)管理器120邏輯的舉例。總體上看,在對(duì)象依賴關(guān)系圖G121中的節(jié)點(diǎn)能通過對(duì)對(duì)象管理器的API調(diào)用來建立create_node(obj_id,initial_version_num,thresh_weight)(建立節(jié)點(diǎn))181。通過API調(diào)用能建立圖中已有節(jié)點(diǎn)之間的依賴關(guān)系add_dependency(source_object_id,target_object_id,dep_weight)(增添依賴關(guān)系)182。通過API調(diào)用能設(shè)置對(duì)應(yīng)于對(duì)象“obj_id”的依賴關(guān)系列表169define_consisfency_list(obj_id,listof_objects)(定義依賴關(guān)系)183。通過delete_node(obj_id)(刪除節(jié)點(diǎn))184這個(gè)API函數(shù)能從G圖中刪除節(jié)點(diǎn)。cache_latest_version(obj_id,cache)(高速緩存最新版本)185這個(gè)API函數(shù)向高速緩存添加一個(gè)對(duì)象的最新版本。copy_object(obj_id,to_cache_id,from_cache_id)(復(fù)制對(duì)象)186這個(gè)API函數(shù)試圖從一個(gè)高速緩存向另一個(gè)高速緩存復(fù)制一個(gè)對(duì)象的一個(gè)版本。通過API調(diào)用delete_object(obj_id,cache)(刪除對(duì)象)187從高速緩存中刪除對(duì)象。改變底層數(shù)據(jù)值的應(yīng)用程序必須通知對(duì)象管理器。用于實(shí)現(xiàn)這一點(diǎn)的兩個(gè)API調(diào)用是object_has_changed(obj_id)(對(duì)象已改變)188,其中的obj_id參數(shù)指定一個(gè)圖對(duì)象;以及objects_have_changed(list_of_objects)(若干對(duì)象已改變)189,其中的list_of_objects參數(shù)包括圖對(duì)象(實(shí)際是指向圖對(duì)象的指針)的列表。通過下述API調(diào)用能創(chuàng)建對(duì)應(yīng)于一個(gè)SRO的節(jié)點(diǎn)create_sro_node(obj_id,initial_version_num,thresh_weight,relation_name,list_of_attribute_values)(建立SRO節(jié)點(diǎn))190。通過下述API創(chuàng)建MRO:create_mro_node(obj_id,initial_version_num,thresh_weight,relation_name,list_of_attributeconditions,rel_default_weight,rel_default_threshold)(建立MRO節(jié)點(diǎn))191。compare_object(obj_id,cache_id1,cache_id2)(比較對(duì)象)192這個(gè)API能用于確定在高速緩存cache_id1和高速緩存cache_id2中對(duì)象obj_id的版本的相似程度。update_cache(cache)(更新高速緩存)193這個(gè)API保證該高速緩存中的所有項(xiàng)目都是當(dāng)前的。define_relation(relation_name,list_of_attributes)(定義關(guān)系)194這個(gè)API定義與對(duì)象管理器的關(guān)系。通過下述API能在一個(gè)或多個(gè)記錄改變時(shí)通知對(duì)象管理器record_has_changed(relation_name,list_of_attribute_valuls)195(記錄已改變)records_have_changed(relation_name,list_of_attribute_conditlions)196(若干記錄已改變)。通過下述API調(diào)用創(chuàng)建對(duì)象依賴關(guān)系圖G121中的節(jié)點(diǎn)create_node(obj_id,initial_version_num,thresh_weight)(創(chuàng)建節(jié)點(diǎn))181。本行專家會(huì)理解,在本發(fā)明的精神和范圍內(nèi)能以直接方式實(shí)現(xiàn)許多其他API。例如,能增加API在已創(chuàng)建一個(gè)節(jié)點(diǎn)后來修改object_id_160,version_num161以及threshold_weight168各字段。通過下述API調(diào)用創(chuàng)建圖中已存在節(jié)點(diǎn)之間的依賴關(guān)系add_dependency(soure_object_id,target_object_id,dep_weight)(增添依賴關(guān)系)182。本行專家會(huì)理解,在本發(fā)明的精神和范圍內(nèi)能以直接方式實(shí)現(xiàn)許多其他API。例如,還能增加API來刪除依賴關(guān)系和修改依賴關(guān)系權(quán)。通過下述API設(shè)置對(duì)應(yīng)于對(duì)象“obj_id”的一致性列表169:define_consistency_list(obj_id,list_of_objects)(定義一致性列表)183。obj_id的一致性列表最好不允許包括該obj_id作為一個(gè)成員。API防止發(fā)生這種情況。能在本發(fā)明的精神和范圍內(nèi)類似地添加API以在一致性列表169創(chuàng)建之后修改它們。當(dāng)一個(gè)對(duì)象已被高速緩存之后,一個(gè)對(duì)象的依賴關(guān)系信息塊(DIB)128(圖16)的變化可能需要更新一個(gè)或多個(gè)高速緩存127。這是直接了當(dāng)?shù)氖隆T趶囊粋€(gè)新的圖對(duì)象o2對(duì)一被高速緩存的對(duì)象o1的一個(gè)新的依賴關(guān)系的情況中,如果目標(biāo)管理器不知道o2是何時(shí)被創(chuàng)建的或者o2的DIB時(shí)標(biāo)162>o1的DIB時(shí)標(biāo)142,則這個(gè)新的依賴關(guān)系是過時(shí)的。通過delete_node(obj_id)(刪除節(jié)點(diǎn))184這個(gè)API能把節(jié)點(diǎn)刪除。通過下述API能明確地向高速緩存添加對(duì)象cache_latest_version(obj_id,cache)(高速緩存最新版本)185;copy_object(obj_id,to_cache_id,from_cache_id)(復(fù)制對(duì)象)186。這些API在高速緩存目錄中創(chuàng)建新的OIB135,如果對(duì)于該對(duì)象還不存在OIB的話。圖19描述API函數(shù)cache_latest_version(obj_id,cache)185的舉例。如所描述的那樣,在步驟2030,確認(rèn)參數(shù)obj_id和cache分別指定已存在的對(duì)象和高速緩存。如果是這樣的話,處理進(jìn)入步驟2040。如果不是這樣,則回送適當(dāng)?shù)臓顟B(tài)信息,處理進(jìn)入步驟2010。在步驟2040,確定一個(gè)對(duì)象的最新版本是否在該高速緩存中。如果是,處理繼續(xù)步驟2010。如果不是,則在步驟2050試圖從依賴關(guān)系信息塊(DIB)128(圖16)中的latest_object字段1601中得到obj_id的最新版本。如果該字段為空,則在步驟2050計(jì)算obj_id的最新值(還可能通過DIB的latest_object字段1601使它能被訪問),并更新依賴關(guān)系信息塊(DIB)128中的version_num字段161。在步驟2050,或者完全重新計(jì)算obj_id的新版本,或者只計(jì)算其若干部分并使新的部分與已存在的版本的部分合并。后一種方法往往比前一種方法更有效。在高速緩存的目錄130中為obj_id創(chuàng)建一個(gè)OIB10’,如果它尚不存在的話。如果該高速緩存先前不包含obj_id的任何版本,則該高速緩存被添加到obj_id的存儲(chǔ)列表163。OIB10’(圖14)的version_num141和timestamp142字段被設(shè)置成依賴關(guān)系塊(DIB)128(圖16)的version_num161和timestamp162字段。OIB10’(圖14)的actual_weight字段143被設(shè)置成該DIB的sum_weight字段167。對(duì)于屬于OIB10’(圖14)的dep-list144的每個(gè)(o2,weight_act,version_num)三元組,weight_act152被設(shè)置成DIB的incoming_dep164上的相應(yīng)邊緣的weight165。version_num153被設(shè)置成o2的DIB中包含的version_num161字段。在步驟2060,保證保持了一致性。這一函數(shù)遞歸地確保,每當(dāng)obj2的0IB10’中的時(shí)標(biāo)142處在obj_id的DIB128的時(shí)標(biāo)162之前時(shí),obj_id的一致性列表169上所有非當(dāng)前對(duì)象obj2被更新或被令其無效。如果在這一過程中任何這種對(duì)象obj2被更新,則類似步驟遞歸地應(yīng)用于每個(gè)所述obj2的一致性列表169。步驟2050和2060的順序?qū)τ诒緦?shí)施例的正確性并不重要。圖20描述API函數(shù)copy_object(obj_id,to_cache_id,from_cache_id)186的舉例。如所描述的那樣,在步驟2100確認(rèn)參數(shù)obj_id、to_cache_id及from_cache_id都被對(duì)象管理器識(shí)別出來。如果是,在步驟2110確定from_cache_id是否有obj_id的一個(gè)副本。如果不是,則什么事也不發(fā)生,處理進(jìn)入步驟2010。對(duì)此(以及其他情況)設(shè)置適當(dāng)?shù)臓顟B(tài)變量并將其回送給應(yīng)用程序以指出發(fā)生了什么事。否則,處理繼續(xù)步驟2120,在那里確定to_cache_id和from_cache_id是否包括obj_id的完全相同的版本。如果是,則不需進(jìn)行復(fù)制,于是處理繼續(xù)進(jìn)入步驟2010。否則,步驟2130確定是否from_cache_id包含obj_id的最新版本。如果是,則在步驟2140,該對(duì)象被復(fù)制到to_cache_id的對(duì)象存儲(chǔ)區(qū)132,而且高速緩存目錄130被更新。obj_id的一個(gè)OIB10’被創(chuàng)建在to_cache_id的目錄130中,如果它尚不存在的話。如果to_cache_id先前不包含obj_id的任何版本,則to_cache_id被添加到obj_id的存儲(chǔ)列表163。在步驟2170,通過確保在一致性列表169上OIB時(shí)標(biāo)142先于obj_id的DIB時(shí)標(biāo)的所有非當(dāng)前對(duì)象或被更新或被令其無效,以此來保持一致性。否則,如果步驟2130的結(jié)果是否定的,則在步驟2150該對(duì)象不被允許復(fù)制,除非(1)在obj_id的一致性列表169上的其非當(dāng)前版本被存于to_cache_id的所有對(duì)象所具有的時(shí)標(biāo)142與from_cache_id中的obj_id版本的時(shí)標(biāo)142相同;以及(2)在obj_id的一致性列表169上的其當(dāng)前版本被存于to_cache_id的所有對(duì)象所具有的時(shí)標(biāo)142與from_cache_id中的obj_id版本的時(shí)標(biāo)142相同或在其之前。如果這些條件被滿足,則在步驟2160,obj_id被從from_cache_id復(fù)制到to_cache_id。在to_cache_id的目錄130中創(chuàng)建obj_id的OIB10’,如果它尚不存在的話。如果to_cache_id先前不包含obj_id的任何版本,則to_cache_id被添加到obj_id的存儲(chǔ)列表163。對(duì)API函數(shù)copy_object和cache_latest_version的直接擴(kuò)充是加上若干標(biāo)志,如果在一致性列表上的其他對(duì)象也需要被更新的話,這些標(biāo)志能防止一個(gè)對(duì)象被存儲(chǔ)。另一個(gè)直接擴(kuò)充是另一些標(biāo)志,如果一個(gè)高速緩存未曾包括object_id的任何版本的話,則只把該object_id存入該高速緩存。另一直接擴(kuò)充是一個(gè)系統(tǒng),那里的對(duì)象管理器維持一個(gè)對(duì)象的所有先前版本。于是,我們會(huì)有API函數(shù)用于向一個(gè)高速緩存添加由具體的一對(duì)參數(shù)(object_id,version_num)所標(biāo)識(shí)的特定對(duì)象。通過API調(diào)用delete_object(obj_id,cache)(刪除對(duì)象)187能從一高速緩存中刪除對(duì)象。本行專家會(huì)理解,根據(jù)這里的描述實(shí)現(xiàn)這一函數(shù)是直接了當(dāng)?shù)?。由這一API完成的一個(gè)功能的舉例是對(duì)于由obj_id標(biāo)識(shí)出的對(duì)象,從依賴關(guān)系信息塊(OIB)128(圖16)的storage_list字段163中去掉高速緩存cache。改變底層數(shù)據(jù)值的應(yīng)用程序必須通知對(duì)象管理器。實(shí)現(xiàn)這一點(diǎn)的兩個(gè)API是object_has_changed(obj_id)(對(duì)象已改變)188,這里obj_id參數(shù)標(biāo)識(shí)一個(gè)圖對(duì)象;以及objects_have-changed(list_of_objects)(若干對(duì)象已改變)189,這里的list_of_objects參數(shù)包括圖對(duì)象(的指針)的列表。如果經(jīng)常有l(wèi)ist_of_objects上的圖對(duì)象影響許多其他圖對(duì)象的情況,則API函數(shù)objects_have_changed將對(duì)比列表上的每個(gè)圖對(duì)象都調(diào)用一次API函數(shù)object_has_changed更有效。圖21描述API函數(shù)objects_have_changed(listvof_objects)189的舉例。本行專家會(huì)理解,再實(shí)現(xiàn)API函數(shù)object_has_changed(obj_id)是直接了當(dāng)?shù)摹楸阌诮忉?,我們假定list_of_objects的每個(gè)元素對(duì)應(yīng)于G中的一個(gè)有效節(jié)點(diǎn),而且在list_of_objects上沒有任何兩個(gè)元素代表同一節(jié)點(diǎn)。根據(jù)這里的詳細(xì)描述能直接地使這一函數(shù)適應(yīng)于不是這里所假定情況的場(chǎng)合。如所描述的那樣,在步驟2400使計(jì)數(shù)器num_updates125(圖12c)加1。在步驟2402,確定與list_of_objects參數(shù)所指定的圖對(duì)象對(duì)應(yīng)的所有節(jié)點(diǎn)是否都已被訪問(visit)過。如果是,則在步驟2403跟隨進(jìn)行更新傳播階段(見圖22),在步驟2404跟隨進(jìn)行一致性檢驗(yàn)階段(見圖26)。如果不是,則在步驟2405,對(duì)應(yīng)于list_of_objects上一個(gè)圖對(duì)象的一個(gè)新節(jié)點(diǎn)被訪問。令obj_id是該節(jié)點(diǎn)的object_id。對(duì)象管理器把obj_id的依賴關(guān)系信息塊(DIB)128中的version_num字段增量1,并把時(shí)間標(biāo)記字段162設(shè)置成num_up_dates125之值。步驟2406和2408表示一個(gè)循環(huán),它通知包含obj_id的每個(gè)高速緩存C1(從存儲(chǔ)列表163中得到)去更新obj_id的版本或令其無效。在步驟2406,調(diào)用函數(shù)update_or_invalidate(c1,obj_id)(更新或令其無效)(見圖25)來使更新obj_id的版本或令其無效這件事實(shí)際發(fā)生。本行專家會(huì)理解,在步驟2406中應(yīng)用選擇來確定哪些高速緩存必須更新它們的obj_id副本或令其無效,這是可以直接了當(dāng)?shù)貙?shí)現(xiàn)的。圖25描述了update_or_invalidate(cacheid,objectid)邏輯的舉例。每當(dāng)當(dāng)前在cacheid中的objectid版本必須被更新或被令其無效(例如見圖21的步驟2406)時(shí),該函數(shù)便被調(diào)用。如所描述的那樣,在步驟2407確定在cacheid中是否應(yīng)更新objectid。如果回答是“不”,則在步驟2440從該高速緩存中取消objectid并在步驟2441該過程返回。如果回答是“是”,則在步驟2442進(jìn)行對(duì)objectid的OIB10’(圖14)下列改變1.versionnum141和timestamp142字段被設(shè)置成依賴關(guān)系信息塊(DIB)128(圖16)中包含的當(dāng)前version_num161和timestamp162。2.a(chǎn)ctual_weight字段143被設(shè)置成DIB中的sum_weight字段167。3.dep_list144(圖15)被更新。列表144中的每個(gè)成員對(duì)應(yīng)于一個(gè)圖對(duì)象o2,該對(duì)象與objectid標(biāo)識(shí)的對(duì)象有一個(gè)依賴關(guān)系。weight_act152被設(shè)置成與G中同一邊緣相對(duì)應(yīng)的依賴關(guān)系信息塊(DIB)128(圖16)中的weight(權(quán))165字段,如果這兩個(gè)量不同的話。此外,version_num153被設(shè)置成o2的DIB中包含的version_num字段161,如果這兩個(gè)量不同的話。在步驟2444,在對(duì)象存儲(chǔ)區(qū)132中包含的objectid實(shí)際值被更新。首先,試圖從依賴關(guān)系信息塊(DIB)128(圖16)中的latest_object字段1601中得到objectid的被更新版本。如果這一嘗試成功了,則步驟2444結(jié)束。如果這失敗了(即這個(gè)指針為空),則計(jì)算出objectid的被更新版本,例如可完全地計(jì)算objectid的新版本,也可只重新計(jì)算其若干部分再把這新的部分與已有版本中的部分合并。在任何一種情況下,對(duì)象管理器都可以選擇更新DIB中的latest_object字段,從而使可能需要objectid最新版本的其他高速緩存能簡(jiǎn)單地復(fù)制它而不必重新計(jì)算它。在某些情況中,在步驟2444,objectid的實(shí)際值能用objectid的較新版本更新,它最好是最新的一個(gè)易于訪問的版本(它通常會(huì)是以最高的version_num141高速緩存的版本),但它不是實(shí)際的當(dāng)前版本。如果計(jì)算objectid的當(dāng)前值是無法容忍地昂貴的話,這樣做是有好處的。最好是,在下列條件之一成立的情況下不允許這種類型的更新1.objectid是已傳送給函數(shù)objects_have_changed(list_of_objects)的列表上的對(duì)象之一;或2.對(duì)于objectid的較新版本,仍然是actual_weight143<threshold_weight168的情況。在步驟2443,(object_id160,cacheid)對(duì)被添加到consistency_list169上的每個(gè)對(duì)象(它是在cacheid標(biāo)識(shí)的高速緩存中)的一致性堆棧128.5(圖12)。對(duì)象管理器120在一致性檢驗(yàn)階段(圖26)確保一致性堆棧128.5上的所有被高速緩存的項(xiàng)目都是一致的。能以幾種方式實(shí)現(xiàn)一致性堆棧;兩種可能的結(jié)構(gòu)是列表和平衡樹(參考Aho,Hopcroft,Ullman)。列表的優(yōu)點(diǎn)是插入為恒定時(shí)間。其缺點(diǎn)是在列表上會(huì)出現(xiàn)項(xiàng)目的重復(fù)副本。平衡樹的優(yōu)點(diǎn)是不需存儲(chǔ)重復(fù)項(xiàng)目。缺點(diǎn)是插入是O(leg(n)),這里n是一致性堆棧上的項(xiàng)目數(shù)。步驟2443可以在把一對(duì)象添加到一致性堆棧之前任意地增加更多的選擇性。令object_id2是在cacheid中的一致性列表169上的一個(gè)對(duì)象。如果cacheid包含object_id2的一個(gè)當(dāng)前版本,則(object_id2,cacheid)不必被添加到一致性堆棧。如果以下兩個(gè)條件都成立,則該版本是當(dāng)前版本1.在處理對(duì)函數(shù)objects_have_changed(list_of_objects)189的當(dāng)前調(diào)用中已經(jīng)訪問過對(duì)應(yīng)于object_id2的頂點(diǎn)。這是當(dāng)且僅當(dāng)對(duì)象object_id2的依賴關(guān)系信息塊(DIB)128(圖16)中的時(shí)間標(biāo)記timestamp字段162等于num_updates125時(shí)才成立的;以及2.對(duì)于對(duì)象object_id2,在OIB10’(圖14)中的version_num字段141和DIB中的161相同。如果在步驟2443中確定(1)和(2)都成立,則(object_id2,cacheid)不被添加到一致性堆棧。如果(1)成立而(2)不成立,步驟2443能遞歸地調(diào)用關(guān)于object_id2和cacheid的函數(shù)update_or_invelidate,這能使得不需要把(object_id2,cache_id)添加到一致性堆棧。本行專家能根據(jù)這里的描述容易地以任何順序或并行地實(shí)現(xiàn)步驟2442、2443及2444。圖22描述了函數(shù)objects_have_changed(list_of_objects)189的更新傳播階段。由步驟2403和2416完成的基本功能是遍歷能從list_of_objects訪問的圖G的所有邊緣。最好采用的技術(shù)與“深度優(yōu)先搜索”(參考Aho,Hopcroft,Ullman)類似。然而,本行專家能容易地使該技術(shù)適于與其他圖形遍歷方法(如“寬度優(yōu)先搜索”)一起工作。圖23描述了響應(yīng)底層數(shù)據(jù)變化通過對(duì)象依賴關(guān)系圖以“深度優(yōu)先搜索”(dfs)傳播變化的一種方法的一部分。假定從第一節(jié)點(diǎn)obj1到第二節(jié)點(diǎn)obj2的一個(gè)邊緣剛剛被遍歷過。在步驟2416確定節(jié)點(diǎn)obj2是否已被訪問過。當(dāng)且僅當(dāng)obj2的時(shí)間標(biāo)志162(圖16)=num_updates125(圖12)時(shí)回答為“是”。如果步驟2416的結(jié)果為“真”,處理繼續(xù)到步驟2417。這一步驟是一個(gè)循環(huán)的一部分,在此地對(duì)storage_list163(圖16)上的所有高速緩存進(jìn)行檢查,看它們是否包括obj2的副本。請(qǐng)注意,每個(gè)對(duì)象最好有一個(gè)object_id字段和一個(gè)version_number字段。object_id字段對(duì)應(yīng)于一個(gè)能由應(yīng)用程序用來識(shí)別該對(duì)象的東西(例如URL),而version_number字段允許維持具有同一object_id的多重對(duì)象并使它們唯一地被標(biāo)識(shí)出來。對(duì)于每個(gè)這樣的高速緩存cacheid,在步驟2420通過比較OIB10’(圖14)中的version_num字段141和依賴關(guān)系信息塊(DIB)128(圖16)中的version_num字段161來確定obj2的版本是否是當(dāng)前版本。如果步驟2420的結(jié)果是肯定的,則在步驟2421確保在obj2的dep_list144上對(duì)應(yīng)于obj1的元素有version_num153等于obj1的DIB中的version_num161。如果步驟2420的結(jié)果是否定的,即obj2的版本不是當(dāng)前版本,則函數(shù)decrease_weight(cacheid,obj1,obj2)(減權(quán))被調(diào)用(見圖24)。請(qǐng)回想一下,每個(gè)邊緣能伴有一個(gè)非負(fù)數(shù)稱作權(quán),它代表該數(shù)據(jù)依賴關(guān)系的重要性。例如,大數(shù)能代表重要的依賴關(guān)系,而小的數(shù)代表不重要的依賴關(guān)系。還請(qǐng)回憶一下,對(duì)象還能伴有一個(gè)值稱作threshold_weight(權(quán)閾值)。每當(dāng)對(duì)應(yīng)于當(dāng)前輸入的數(shù)據(jù)依賴關(guān)系的權(quán)之和落在threshold_weight之下時(shí),該對(duì)象便被認(rèn)為是高度過時(shí)的。對(duì)于需要對(duì)象新近版本的應(yīng)用,這些對(duì)象應(yīng)被更新或令其失效。如果步驟2416的結(jié)果是“假”,則在步驟2423,obj2的version_num字段被加一增量,并設(shè)時(shí)間標(biāo)記timestamp字段162為num_updates125(圖12),它表明obj2已被訪問過。步驟2424是一個(gè)循環(huán)的一部分,那里檢驗(yàn)storage_list163上的所有高速緩存,看它們是否包括obj2的一個(gè)副本。對(duì)于每個(gè)這種高速緩存cacheid,在步驟2425,函數(shù)decrease_weight(cacheid,obj1,obj2)被調(diào)用。在退出該循環(huán)后,在步驟2426,對(duì)于所有從obj2出發(fā)的邊緣遞歸調(diào)用dfs邏輯(圖23)。圖24描述decrease_weight(cacheid,from_obj,to_obj)(減權(quán))邏輯的舉例。如所描述的那樣,在步驟2425,對(duì)象to_obj的實(shí)際權(quán)actual_wieght字段被減去w,這里w是對(duì)應(yīng)于從from_obj到to_obj的邊緣的weight_act字段152。在步驟2435,確定是否actual_weight143<threshold_weight168;如果回答為“是”,則函數(shù)update_or_invalidate(cacheid,to_obj)被調(diào)用。如果回答為“否”,則在步驟2436,對(duì)應(yīng)于從from_obj到to_obj的邊緣的weight_act字段152被設(shè)為零。在更新傳播階段之后,對(duì)象管理器必須保證consistency_lists169在事實(shí)上是一致的。這是在圖26中描述的一致性校驗(yàn)階段進(jìn)行的。如所描述的那樣,步驟2404是一個(gè)循環(huán)的一部分,它檢驗(yàn)一致性堆棧128.5(圖12c)中的每個(gè)(object_id_160,cache_id135)對(duì)。對(duì)每個(gè)這樣的對(duì)子,在步驟2451,通過比較version_uum字段141和version_num字段161,來檢驗(yàn)高速緩存cache_id中的object_id版本是否是當(dāng)前版本。如果回答為“是”,處理返回步驟2404。否則,該對(duì)象必須被更新或被令其無效。在步驟2455,確定該對(duì)象是否應(yīng)被更新。如果回答為“否”,則在前述步驟2440中(見圖25)該對(duì)象被令其無效。如果回答為“是”,則在步驟2050將最新值添入高速緩存,并在步驟2060使新的一制性約束得到滿足(這兩點(diǎn)在前面都描述過,見圖19)。對(duì)于本例的正確性,步驟2050和2060的順序無關(guān)緊要。另一個(gè)API函數(shù)update_cache(cache)(更新高速緩存)193保證高速緩存中的所有項(xiàng)目都是當(dāng)前的。這是通過檢驗(yàn)高速緩存中每個(gè)對(duì)象的OIB,并對(duì)過時(shí)的項(xiàng)目令其無效或進(jìn)行更新來實(shí)現(xiàn)的。它忽略了一致性列表,因?yàn)樗袑?duì)象都將是當(dāng)前的,所以在完成該函數(shù)之后它們必須是一致的。關(guān)系本發(fā)明在處理記錄(這些“記錄”與最佳實(shí)施例中所用“記錄”不是同義詞)方面有特別之處,這些記錄可以是一個(gè)關(guān)系數(shù)據(jù)庫的一部分(見J.Melton和A.R.Simon,MorganKaufmann的“理解新SQL一個(gè)完全的指南”,1993)。例如,假定一個(gè)關(guān)系rel_name有屬性age和weight,二者都是整型。在下文中,rel_name(age=25,weight=34)代表一單個(gè)記錄,而rel_name(age=25)則是一個(gè)多重記錄指示符(MRS)并代表屬于age=25的rel_name的所有記錄。本發(fā)明的特點(diǎn)是允許管理對(duì)應(yīng)于或者單個(gè)或者多重記錄的對(duì)象。這種對(duì)象稱作關(guān)系對(duì)象。一個(gè)單一對(duì)象能代表來自同一關(guān)系的多重記錄。這樣一個(gè)對(duì)象稱作多重記錄對(duì)象(MRO),而對(duì)應(yīng)于單個(gè)記錄的對(duì)象稱作單記錄對(duì)象(SRO)。如果對(duì)應(yīng)于關(guān)系對(duì)象obj2的記錄集是對(duì)應(yīng)于一個(gè)MROobj1的記錄集的子集,則稱MROobj1包含(包括)另一個(gè)關(guān)系對(duì)象obj2。對(duì)象管理器自動(dòng)地把依賴關(guān)系從一個(gè)關(guān)系對(duì)象添加到包含它的一個(gè)MRO中對(duì)象管理器維持一個(gè)平衡樹,稱作多重記錄樹(MRT)122,它包含指向G中所有MRO節(jié)點(diǎn)的指針,并被依賴關(guān)系信息塊(DIB)128(圖16)中的關(guān)系串relational_string字段1602按字母順序編排索引。稱作單關(guān)系樹(SRT)的平衡樹包含指向G中所有SRO節(jié)點(diǎn)的指針,而且也被DIB中的關(guān)系串relational_string字段1602編排索引。根據(jù)這里的描述不難實(shí)現(xiàn)的另一種途徑是對(duì)單個(gè)關(guān)系和多重關(guān)系二者維持單一的平衡樹。另一個(gè)變體將是利用數(shù)據(jù)結(jié)構(gòu)而不是用平衡樹來維持這一信息。根據(jù)本發(fā)明,在創(chuàng)造一個(gè)關(guān)系對(duì)象之前,必須通過API函數(shù)define_relation(relation_name,list_of_attributes)(定義關(guān)系)194,使對(duì)象管理器標(biāo)識(shí)出這個(gè)關(guān)系。list_of_attributes(屬性列表)這個(gè)參數(shù)的每個(gè)元素是包含該屬性名字和類型的一對(duì)。API函數(shù)define_relation194把關(guān)于關(guān)系的信息存于關(guān)系信息區(qū)129(圖12)。圖27描述創(chuàng)造對(duì)應(yīng)于單記錄對(duì)象(SRO)的一個(gè)節(jié)點(diǎn)的邏輯的舉例。請(qǐng)回想一下,對(duì)應(yīng)于單個(gè)記錄的一個(gè)對(duì)象稱作單記錄對(duì)象(SRO)。稱作單關(guān)系樹(SRT)的平衡樹包含指向G中所有SRO節(jié)點(diǎn)的指針,而且也被DIB(圖16)中的relational_string字段1602按字母順序安排索引。通過API函數(shù)create_sro_node(obj_id,initial_version_num,thresh_weight,relation_name,list_of-attribute_values)(創(chuàng)建SRO節(jié)點(diǎn))190(圖18a)來創(chuàng)造對(duì)應(yīng)于一個(gè)SRO的節(jié)點(diǎn)?,F(xiàn)在參考圖27,在步驟2300確定是否所有輸入?yún)?shù)都有效(例如,它們有正確地類型等)。還通過檢驗(yàn)關(guān)系信息區(qū)129來確認(rèn)關(guān)系“relation_name”先前曾通過調(diào)用define_relation194定義過。還要確認(rèn)list_of_attributes包含值的個(gè)數(shù)正確而且所有值的類型正確。還要確認(rèn)obj_id的一個(gè)節(jié)點(diǎn)或?qū)?yīng)于這同一記錄的節(jié)點(diǎn)并非已經(jīng)存在(不難修改設(shè)計(jì),從而當(dāng)obj_id的一個(gè)節(jié)點(diǎn)已經(jīng)存在時(shí),該舊的節(jié)點(diǎn)將被重寫)。還不難修改設(shè)計(jì),使能存在具有同一obj_id的多重節(jié)點(diǎn)。還不難允許多重節(jié)點(diǎn)對(duì)應(yīng)于同一記錄。如果確定所有參數(shù)都有效,處理繼續(xù)到步驟2305。否則,在步驟2320,create_sro_node函數(shù)返回,并回送適當(dāng)?shù)臓顟B(tài)信息。在步驟2305,通過把object_id160初始化成obj_id,把version_num161初始化成initial_version_num,把threshold_weight168初始化成thresh_weight,把relational_string1602初始化成與所有屬性值相聯(lián)系的relation_name來創(chuàng)建G中的新節(jié)點(diǎn)。構(gòu)成relational_string1602的關(guān)系和屬性值最好都由分隔符分開。這樣,便能容易地從relational_string1602中識(shí)別出關(guān)系和每個(gè)屬性值。一個(gè)多重記錄multiple_recorols_1603字段被設(shè)為“假”。在步驟2310,指向該節(jié)點(diǎn)的一個(gè)指針被添加到SRT。由relational_string1602確定STR中該新指針的位置。在步驟2315,依賴關(guān)系從obj_id添加到包含該對(duì)象的每個(gè)多重記錄對(duì)象(MRO)。通過檢驗(yàn)多重記錄樹MRT122,可找到這些MR0。MRT最好是包含指向G中所有MRO節(jié)點(diǎn)的指針的一個(gè)平衡樹,并由依賴關(guān)系信息塊(DIB)128(圖16)中的relational_string字段1602按字母順序編排索引。只需要對(duì)于relation_name來檢驗(yàn)MRO。所有這種MRO都能在O(log(n)+m)條指令中識(shí)別出來,這里n是MRO的總數(shù),m是對(duì)于relation_name的MRO個(gè)數(shù)。對(duì)于每個(gè)包含obj_id的MRO“obj2_id”,建立一個(gè)從obj_id到obj2_id的依賴關(guān)系。再參考圖16,該依賴關(guān)系最好以obj2_id的mro_dep_weight1604的權(quán)來初始化。obj2_id的threshold_weight168被obj2_id的mro_threshold_increment1605來增量。對(duì)本算法的直接擴(kuò)展將是使用其他技術(shù)對(duì)依賴關(guān)系賦予權(quán)和修改threshold_weight168。現(xiàn)在回到圖27,在步驟2320,該過程帶著狀態(tài)信息返回。步驟2305、2310和2315的順序能被改變。再有,這些步驟可并發(fā)執(zhí)行。圖28描述了創(chuàng)建多重記錄對(duì)象(MRO)的邏輯的舉例。MRO是通過下列API函數(shù)創(chuàng)建的create_mro_node(obj_id,initial_versionnum,thresh_weight,relation_name,list_of_attribute_conditions,rel_default_weight,rel_default_threshold)(創(chuàng)建MRO節(jié)點(diǎn))191(圖18a);屬性條件是如下形式=25;>96;>45及<100;等。屬性條件也可以是“空”,意思是對(duì)屬性值沒有任何限制。請(qǐng)回想一下,單一對(duì)象能代表來自同一關(guān)系的多個(gè)記錄。這樣的對(duì)象稱作多重記錄對(duì)象(MRO),而對(duì)應(yīng)于單個(gè)記錄的對(duì)象稱作單記錄對(duì)象(SRO)。一個(gè)MRO對(duì)象obj1包含另一關(guān)系對(duì)象obj2,如果對(duì)應(yīng)于obj2的記錄集是對(duì)應(yīng)于obj1的記錄集的子集的話。對(duì)象管理器自動(dòng)地把依賴關(guān)系從一關(guān)系對(duì)象添加到包含它的MRO。對(duì)象管理器最好還維持一個(gè)稱作多重記錄樹(MRT)122的平衡樹,它包含指向G中所有MRO節(jié)點(diǎn)的指針,并由依賴關(guān)系信息塊(DIB)128(圖16)中的relational_string字段1602按字母順序編排索引。稱作單關(guān)系樹(SRT)的平衡樹包含指向G中所有SRO節(jié)點(diǎn)的指針,并且也由依賴關(guān)系信息塊(DIB)中的relational_string字段1602按字母順序編排索引。如所描述的那樣,在步驟2600,確定是否輸入?yún)?shù)全部有效(例如它們有正確的類型等)。此外,還通過檢驗(yàn)關(guān)系信息存儲(chǔ)區(qū)129(圖12)來驗(yàn)證先前曾通過調(diào)用define_relation194API(圖18a)定義過關(guān)系“relation_name”。還驗(yàn)證list_of_attribute_conditions(屬性條件列表)是有效的;以及obj_id節(jié)點(diǎn)或?qū)?yīng)于同一個(gè)記錄集的節(jié)點(diǎn)尚沒有存在。本行專家將會(huì)理解,不難修改設(shè)計(jì),從而當(dāng)obj_id的節(jié)點(diǎn)已經(jīng)存在時(shí),該老節(jié)點(diǎn)會(huì)被重寫。還不難修改設(shè)計(jì),從而使具有相同obj_id的多重節(jié)點(diǎn)能夠存在。還不難允許多重節(jié)點(diǎn)對(duì)應(yīng)于同一個(gè)記錄集。如果步驟2600的結(jié)果是確定所有參數(shù)有效,則處理繼續(xù)到步驟2605。否則,在步驟2620,create_mro_node帶著適當(dāng)?shù)臓顟B(tài)信息返回。在步驟2605(還參考圖16),通過把object_id160初始化成obj_id,把version_num161初始化成initial_version_num,把treshold_weight168初始化成thresh_weight,以及把relational_string1602初始化成與所有屬性狀態(tài)相聯(lián)系的relation_name,使在G中創(chuàng)建一個(gè)新節(jié)點(diǎn)。構(gòu)成relational_string1602的關(guān)系和屬性條件都由分隔符分開。這樣,便能容易地從relational_string1602中識(shí)別出關(guān)系及每個(gè)屬性條件。multiple_records1603字段被設(shè)為“真”;mro_dep_weight1604被設(shè)為rel_default_weight;以及mro_threshold_increment_1605被設(shè)為rel_default_threshold。在步驟2610,一個(gè)指向該節(jié)點(diǎn)的指針被添加到MRT。該新指針在MRT中的位置由reldtional_string1602確定。在步驟2615,以步驟2315同樣的方式把依賴關(guān)系從obj_id添加到包含它的每個(gè)MRO。對(duì)于每個(gè)obj_id中包括對(duì)象obj2_id,在步驟2625把一個(gè)依賴關(guān)系從obj2_id添加到obj_id。通過搜索MRT122和SRT123并考慮對(duì)于relation_name的所有其他關(guān)系對(duì)象,由此來找出這種依賴對(duì)象。對(duì)于對(duì)象obj_id,每個(gè)依賴關(guān)系被予權(quán)mro_dep_weight1604。對(duì)于每個(gè)這樣的依賴關(guān)系,對(duì)obj_id的threshold_weight168被增加一個(gè)增量,該增量是對(duì)obj_id的mro_threshold_increment1605。本行專家將會(huì)理解,其他技術(shù)也能用來對(duì)依賴關(guān)系賦予權(quán),并修改threshold_weight168。在步驟2620,create_mro_node帶著狀態(tài)信息返回。步驟2605、2610、2615和2625的順序可以改變。再有,這些步驟可以并發(fā)執(zhí)行。另一種做法是,關(guān)系對(duì)象obj1對(duì)包含它的MROobj2的依賴關(guān)系的權(quán)可以以obj2相對(duì)應(yīng)的也被包含在obj1中的記錄所占的比例和重要性為基礎(chǔ)。這一變體能被應(yīng)用到步驟2315、2615或2625。如果兩個(gè)MRO中任何一個(gè)都不是另一個(gè)的子集,但這兩個(gè)MRO有一個(gè)或多個(gè)記錄是共同的,在這種情況下的另一種作法可以是有選擇地在兩個(gè)MRO之間添加依賴關(guān)系?,F(xiàn)在回到圖16,本行專家將會(huì)理解,在本發(fā)明的精神和范圍內(nèi),能增加API,以便在通過API函數(shù)create_sro_node190或create_mro_node191定義過一個(gè)關(guān)系對(duì)象之后能對(duì)它修改relational_string1602、multiple_records1603、mro_dep_weight1604、及mro_threshold_increment1605。當(dāng)一個(gè)或多個(gè)記錄改變時(shí),對(duì)象管理器能通過以下API函數(shù)(圖18a)得到通知record_has_changed(relation_name,list_of_attributevalues)195及records_have_changed(relation_name,list_of_attributeconditions)196。這些API自動(dòng)地在整個(gè)依賴關(guān)系結(jié)構(gòu)中傳播這種改變。圖29a描述了如何實(shí)現(xiàn)API函數(shù)records_have_changed(relation_name,list_of_attribute_conditions)(若干記錄已改變)196。本行專家將會(huì)理解,由此來實(shí)現(xiàn)record_has_changed(relation_name,list_of_attribute_values)(一個(gè)記錄已改變)是直接了當(dāng)?shù)摹H缢枋龅哪菢?,在步驟2700確定輸入?yún)?shù)是否有效。還要通過檢驗(yàn)關(guān)系信息區(qū)129(圖12)來驗(yàn)證關(guān)系relation_name是否先前曾被定義過(通過調(diào)用define_relationAPI(圖18a))。還要驗(yàn)證list_of_attribute_conditions是有效的。如果輸入?yún)?shù)有效,處理進(jìn)入步驟2710。否則,在步驟2730,該過程帶著適當(dāng)?shù)膮?shù)信息被終止。在步驟2710,找出包括至少一個(gè)已改變的記錄的所有關(guān)系對(duì)象。這可以通過檢驗(yàn)對(duì)應(yīng)于relation_name的MRT122和SRT123(圖12)上的所有關(guān)系對(duì)象來完成。在步驟2720,通過在步驟2710中識(shí)別出的所有對(duì)象的列表上調(diào)用API函數(shù)objects_have_changed189,能使這個(gè)改變向G中的其他節(jié)點(diǎn)傳播。最后,在步驟2730,records_have_changed返回一個(gè)適當(dāng)?shù)臓顟B(tài)信息。API函數(shù)records_have_changed的一個(gè)直接的變體是在確定如何在整個(gè)G中傳播改變信息時(shí),考慮一個(gè)關(guān)系對(duì)象中已經(jīng)已改變的記錄所占的比例和重要性。API函數(shù)compare_objects(obj_id,cache_id1,cache_id2)(比較對(duì)象)192(圖18b)能被用來確定對(duì)象obj_id在cache_id1和cache_id2這兩個(gè)高速緩存中的版本的彼此相似程度。例如,能比較version_num141字段來檢驗(yàn)這兩個(gè)版本是否相同。如果它們是不同的,由可借助例如version_num141和timestamp142字段(圖14)之差來指出一個(gè)對(duì)象比另一個(gè)對(duì)象的新近程度。如果對(duì)象的兩個(gè)版本不同,則能計(jì)算出一個(gè)相似度評(píng)分,取值范圍是0(最不相似)到<1(1對(duì)應(yīng)于該對(duì)象的完全相同版本)。相似度評(píng)分最好是基于從圖對(duì)象obj_id2到obj_id的到來依賴關(guān)系的權(quán)之和,對(duì)于對(duì)象obj_id2,與cache_id1中的obj_id一致的obj_id2版本和與cache_id2中的obj_id一致的obj_id2版本完全相同。相似度評(píng)分(SS)能用如下公式SS=common_weight/sum_weight167,這里common_weight=與從圖對(duì)象obj_id2到ojb_id的邊緣相對(duì)應(yīng)的權(quán)165之和,這里與邊緣對(duì)應(yīng)的version_num153字段對(duì)于obj_id的兩個(gè)版本是完全相同的。compare_objects(比較對(duì)象)邏輯也能被用來確定兩個(gè)版本是否高度地不相似。當(dāng)且僅當(dāng)common_weight<threshold_weight時(shí)才認(rèn)為它們是高度不相似的。擴(kuò)展對(duì)本發(fā)明的一個(gè)直接擴(kuò)展是在OIB(圖14)中包括threshold_weight字段,并讓高速緩存2’(圖13)獨(dú)立地設(shè)置這些字段。另一個(gè)直接擴(kuò)展是允許對(duì)同一對(duì)象有對(duì)應(yīng)于不同高速緩存的不同的一致性列表。另一個(gè)擴(kuò)展是這樣一個(gè)系統(tǒng),那里會(huì)存在從圖對(duì)象obj1到另一圖對(duì)象obj2的多重依賴關(guān)系,而且這些依賴關(guān)系具有不同的權(quán)。應(yīng)用程序能獨(dú)立地修改這些多重依賴關(guān)系。另一個(gè)擴(kuò)展是使用其他算法根據(jù)到一對(duì)象的過時(shí)鏈接來確定何時(shí)該對(duì)象是過時(shí)的。當(dāng)一個(gè)圖對(duì)象改變時(shí),本最佳實(shí)施例在通過依賴關(guān)系圖G傳播該信息時(shí)并不考慮該圖對(duì)象是如何改變的。它只考慮這樣的事實(shí),即該圖對(duì)象已經(jīng)改變。一個(gè)擴(kuò)展將是還考慮一個(gè)圖對(duì)象是如何改變的,以便把這種改變傳播給其他圖對(duì)象。這可按下述方式完成1.通過參數(shù)向object_has_changed之類函數(shù)提供關(guān)于一個(gè)圖對(duì)象已經(jīng)如何改變的附加信息。這個(gè)信息將被用于修改從該圖對(duì)象到依賴于它的值的其他圖對(duì)象的鏈接,并在其后被用于確定該圖對(duì)象的后繼者們已經(jīng)如何改變。2.當(dāng)對(duì)象管理器120確定一個(gè)圖對(duì)象o2已經(jīng)改變時(shí),該對(duì)象管理器能考慮兩點(diǎn)它的哪些前趨已經(jīng)改變;以及它遞歸地收集的關(guān)于前趨已經(jīng)如何改變的任何信息。然后,對(duì)象管理器將使用這一信息確定o2是如何改變的。關(guān)于o2如何改變的信息將被用于修改到依賴于o2的其他圖對(duì)象的鏈接,還將被用于確定對(duì)o2的繼承者已如何改變。例如,考慮圖29b。u2和u3是已經(jīng)改變的底層數(shù)據(jù)。對(duì)象管理器把改變信息傳播給o1和o3。當(dāng)對(duì)象管理器把改變信息傳播給o2時(shí),在確定如何更新o2的被高速緩存的副本或如何令其無效的時(shí)候,它不僅考慮從o1和o3到o2的邊緣的權(quán),它還考慮u2、u3、o1和o3的改變的性質(zhì)。這一信息也被用于確定如何更新o4的被高速緩存版本或如何令其無效。其他應(yīng)用本發(fā)明還能被用于這樣的系統(tǒng),那里一個(gè)應(yīng)用程序要決定是否要更新底層數(shù)據(jù)。通過檢驗(yàn)對(duì)象依賴關(guān)系圖,系統(tǒng)能確定受底層數(shù)據(jù)改變影響的其他對(duì)象。如果這一設(shè)定是令人滿意的,則將進(jìn)行改變。否則,系統(tǒng)將從“改變底層數(shù)據(jù)”這一操作中退出來。本行專家將會(huì)理解,本發(fā)明還能被編譯器、運(yùn)行時(shí)系統(tǒng)或數(shù)據(jù)庫使用,以便有效地對(duì)操作安排時(shí)間表。不同的操作時(shí)間表會(huì)對(duì)底層數(shù)據(jù)造成不同的改變。通過檢驗(yàn)對(duì)象依賴關(guān)系圖,作時(shí)間表決定的程序能確定一個(gè)最有利的方法來對(duì)操作安排時(shí)間表。維護(hù)和一致性地更新高速緩存的可伸縮方法的詳細(xì)描述本發(fā)明的這一實(shí)施例是設(shè)計(jì)成在由網(wǎng)絡(luò)連接的一個(gè)或多個(gè)物理(計(jì)算機(jī))系統(tǒng)的集合上實(shí)現(xiàn)其功能。在這個(gè)系統(tǒng)集合中可以駐留本發(fā)明的一個(gè)以上的實(shí)現(xiàn)。為了指導(dǎo)區(qū)分本發(fā)明的多個(gè)實(shí)例(instance),雖然可以使用字典,但還是提供了如下的定義對(duì)象源(objectsources)。對(duì)象源包括一個(gè)或多個(gè)產(chǎn)品,如IBM以DB2為商標(biāo)銷售的產(chǎn)品,Lotus(蓮花公司)以LOTUSNOTES和DOMINO服務(wù)器為商標(biāo)銷售的產(chǎn)品,或者其他源3030,包括用于建立更復(fù)雜對(duì)象(如HTML頁面)的數(shù)據(jù)或?qū)ο?。觸發(fā)器(trigger)。能用來響應(yīng)數(shù)據(jù)的修改而使得動(dòng)作自動(dòng)發(fā)生的任何手段。觸發(fā)器是許多標(biāo)準(zhǔn)性對(duì)象源的一個(gè)標(biāo)準(zhǔn)特征,這些標(biāo)準(zhǔn)對(duì)象源諸如IBM以DB2為商標(biāo)銷售的產(chǎn)品,Lotus以LOTUSNOTES和DOMINO服務(wù)器為商標(biāo)銷售的產(chǎn)品,都能響應(yīng)數(shù)據(jù)的修改而自動(dòng)地使動(dòng)作發(fā)生。本發(fā)明的一個(gè)實(shí)施例以一種新的方式使用觸發(fā)器以保持一對(duì)象源中存儲(chǔ)的由數(shù)據(jù)建立的對(duì)象與數(shù)據(jù)同步。觸發(fā)通告(triggernotification)。這是響應(yīng)一對(duì)象源中被調(diào)用的觸發(fā)器而向本發(fā)明發(fā)送的消息。高速緩存事務(wù)(cachetransactions)。包括對(duì)高速緩存管理器提出的讀、更新、或刪除高速緩存對(duì)象的請(qǐng)求。觸發(fā)監(jiān)視器(triggermonitor)。這是根據(jù)本發(fā)明的用于保持高速緩存管理器管理的高速緩存中的對(duì)象與相關(guān)聯(lián)的遠(yuǎn)程數(shù)據(jù)同步的邏輯的一例。觸發(fā)監(jiān)視器可以是一個(gè)監(jiān)視遠(yuǎn)程數(shù)據(jù)源的單個(gè)長(zhǎng)運(yùn)行過程,用于使高速緩存管理器管理的高速緩存中存儲(chǔ)的復(fù)雜對(duì)象與底層數(shù)據(jù)保持一致。主觸發(fā)監(jiān)視器(mastertriggermonitor)。這是觸發(fā)監(jiān)視器的一個(gè)實(shí)例,它接收觸發(fā)通告。從屬觸發(fā)監(jiān)視器(slavetriggermonitor)。這是觸發(fā)監(jiān)視器的一個(gè)實(shí)例,觸發(fā)通告從主觸發(fā)監(jiān)視器3000’傳送給它(即不是直接從對(duì)象源傳送)。本機(jī)高速緩存(localcache)。這是一個(gè)由駐留在高速緩存本身所在的同一物理機(jī)器上的觸發(fā)監(jiān)視器的一個(gè)實(shí)例來進(jìn)行更新的高速緩存(或其他標(biāo)準(zhǔn)對(duì)象存儲(chǔ)器,如一個(gè)文件系統(tǒng))。遠(yuǎn)程高速緩存(remotecache)。這是一個(gè)由駐留在與高速緩存本身不同的物理機(jī)器上的觸發(fā)監(jiān)視器的一個(gè)實(shí)例來進(jìn)行更新的高速緩存(或其他標(biāo)準(zhǔn)對(duì)象存儲(chǔ)器,如一個(gè)文件系統(tǒng))。由本發(fā)明擔(dān)任主觸發(fā)監(jiān)視器3000(如果它接受觸發(fā)事件)和從屬觸發(fā)監(jiān)視器3000a(如果它從某一主觸發(fā)監(jiān)視器接受觸發(fā)事件通告)的雙重角色。現(xiàn)在參考圖件,圖30a描述了具有本發(fā)明特點(diǎn)的系統(tǒng)的方框圖舉例。如所描述的那樣,該系統(tǒng)包括(一個(gè)或多個(gè))遠(yuǎn)程節(jié)點(diǎn)3108。節(jié)點(diǎn)3108可以是通過萬維網(wǎng)服務(wù)器(表示為httpd3080)向客戶機(jī)提供萬維網(wǎng)頁的服務(wù)器。每個(gè)萬維網(wǎng)服務(wù)器能提供大百分比的由數(shù)據(jù)庫3010構(gòu)建的動(dòng)態(tài)萬維網(wǎng)頁。由于產(chǎn)生萬維網(wǎng)頁所涉及的費(fèi)用,每個(gè)這種服務(wù)器節(jié)點(diǎn)100高速緩存一個(gè)或多個(gè)對(duì)象3004,包括復(fù)雜對(duì)象,例如動(dòng)態(tài)萬維網(wǎng)頁。對(duì)同一動(dòng)態(tài)網(wǎng)頁的多重請(qǐng)求能由高速緩存3003滿足,從而降低開銷。使用多重服務(wù)器節(jié)點(diǎn)3108增大了系統(tǒng)能服務(wù)的請(qǐng)求量。服務(wù)器節(jié)點(diǎn)3108在地理上被遠(yuǎn)距離分開,這是可能的,雖然這不是一種要求。根據(jù)本發(fā)明,當(dāng)一個(gè)對(duì)象源(如數(shù)據(jù)庫)3010發(fā)生改變而這種改變會(huì)影響高速緩存3003中存儲(chǔ)的一個(gè)或多個(gè)對(duì)象3004之值時(shí),觸發(fā)監(jiān)視器3000向?qū)ο蟮拿總€(gè)高速緩存管理器3001通告哪些對(duì)象的值已改變。觸發(fā)監(jiān)視器3000可能會(huì)通知高速緩存管理器3001在它的高速緩存3003中的對(duì)象3004已改變。在這種情況中,高速緩存管理器3001會(huì)使對(duì)象3004的副本無效。另一種情況是,觸發(fā)監(jiān)視器3000可能會(huì)通知高速緩存管理器3001對(duì)象3004已改變而且還提供對(duì)象3004的新值。本行專家會(huì)理解,對(duì)象3004的新值可在數(shù)據(jù)服務(wù)器節(jié)點(diǎn)3102以及遠(yuǎn)程節(jié)點(diǎn)3108或某個(gè)中間節(jié)點(diǎn)(例如代理(proxy)節(jié)點(diǎn))被計(jì)算出來。在這另一種情況的每種情形中,高速緩存管理器還會(huì)選擇動(dòng)態(tài)更新對(duì)象3004(例如存儲(chǔ)新版本)而不是令其無效。圖30b描述了觸發(fā)監(jiān)視器3000的一個(gè)更詳細(xì)的舉例。這里,觸發(fā)監(jiān)視器3000被作為主觸發(fā)監(jiān)視器3000’的具體實(shí)例。如所描述的那樣,對(duì)包括復(fù)雜對(duì)象3004的高速緩存3003的維護(hù)是由根據(jù)本發(fā)明稱作觸發(fā)監(jiān)視器3000的這個(gè)過程(或過程集合)來完成的。觸發(fā)監(jiān)視器3000最好是單個(gè)長(zhǎng)運(yùn)行過程,它監(jiān)視數(shù)據(jù)源3050以使高速緩存管理器3001的內(nèi)容與底層數(shù)據(jù)同步。主觸發(fā)監(jiān)視器3000’是觸發(fā)監(jiān)視器3000的一個(gè)實(shí)例,它接受觸發(fā)事件3020。主觸發(fā)監(jiān)視器3000’包括觸發(fā)監(jiān)視器驅(qū)動(dòng)器3040;對(duì)象標(biāo)識(shí)(id)分析邏輯3041;對(duì)象發(fā)生器邏輯3042;以及分布管理器3043。主觸發(fā)監(jiān)視器3000’與對(duì)象源3050、高速緩存管理器3001(稱作本機(jī)高速緩存管理器)以及零個(gè)或多個(gè)其他(從屬)觸發(fā)監(jiān)視器3000”(圖30c)和一個(gè)遠(yuǎn)程高速緩存管理器3002,這些駐留在其他物理機(jī)器上。對(duì)象源3050包括一個(gè)或多個(gè)實(shí)體;例如數(shù)據(jù)庫3010(如由IBM以DB2商標(biāo)銷售的);或任何其他源3030(如由Lotus公司以DOMINO商標(biāo)銷售的),由這些源建造了更復(fù)雜的源(如HTML頁面)。當(dāng)對(duì)象源3050檢測(cè)到一個(gè)改變時(shí),一個(gè)觸發(fā)器被調(diào)用。該觸發(fā)器(它是許多標(biāo)準(zhǔn)對(duì)象源3050(如前述)的標(biāo)準(zhǔn)特征)通常被用于響應(yīng)修改數(shù)據(jù)而自動(dòng)產(chǎn)生行動(dòng)。本發(fā)明以一種新的方式使用觸發(fā)器來保持由對(duì)象源中存儲(chǔ)的數(shù)據(jù)建造的對(duì)象3004與數(shù)據(jù)同步。伴隨該觸發(fā)器的是一個(gè)send_trigger(發(fā)送觸發(fā)器)3026API(見圖30d),它使一消息送到觸發(fā)監(jiān)視器驅(qū)動(dòng)器3040。于是觸發(fā)監(jiān)視器驅(qū)動(dòng)器能響應(yīng)這一消息而產(chǎn)生一個(gè)稱作觸發(fā)事件3020的事務(wù)(見圖30e)。觸發(fā)事件3020能被翻譯(按傳統(tǒng)意義)成記錄ID(標(biāo)識(shí))3012并傳送給高速緩存管理器3001供翻譯。高速緩存管理器3001返回一個(gè)相應(yīng)的對(duì)象ID列表3009,它被排隊(duì)到對(duì)象ID分析(OIA)部分3041。OIA3041用已知手段產(chǎn)生一組對(duì)象分配塊(ODB)3100(下文中描述),每個(gè)對(duì)象ID3009有一個(gè)。圖31描述對(duì)象分配塊(ODB)3100的舉例。對(duì)象ID3009被用于當(dāng)其后代替或刪除對(duì)象時(shí)識(shí)別高速緩存3003中的對(duì)象3004。高速緩存ID3200被用于識(shí)別對(duì)象3004屬于哪個(gè)高速緩存3003。外部ID3101是一個(gè)附加標(biāo)識(shí),對(duì)象發(fā)生器3042會(huì)借助它識(shí)別對(duì)象。請(qǐng)求分配3103被對(duì)象發(fā)生器用于產(chǎn)生“更新對(duì)象請(qǐng)求”3022或“刪除遠(yuǎn)程對(duì)象請(qǐng)求”3025(圖30e)。如果請(qǐng)求分配3103是DispRegenerate(分配再生)3130,由ODB3100代表的對(duì)象3004由系統(tǒng)再生并被分布出去。如果請(qǐng)求分配3103是DispInvalidate(分配無效)3131,則對(duì)象3004被從所有系統(tǒng)中刪除。圖32描述高速緩存ID3200的舉例。如所描述的那樣,高速緩存ID最好包括高速緩存名3201、高速緩存主機(jī)3202標(biāo)識(shí)以及高速緩存端口3203標(biāo)識(shí)。現(xiàn)在回到圖30b,ODB3100被送到對(duì)象發(fā)生器3042。對(duì)象發(fā)生器檢驗(yàn)ODB3100并完成下列兩項(xiàng)之一a)產(chǎn)生一個(gè)刪除遠(yuǎn)程對(duì)象請(qǐng)求3025;b)與對(duì)象源3050建立連接,重建對(duì)象3004,并建立更新對(duì)象請(qǐng)求3022。然后TMD3040把刪除遠(yuǎn)程對(duì)象請(qǐng)求3025或更新對(duì)象請(qǐng)求3022傳送給分布管理器3043。分布管理器3043建立與每個(gè)被配置的遠(yuǎn)程高速緩存管理器3002或從屬觸發(fā)監(jiān)視器3000”(圖30c)的連接并發(fā)送每個(gè)請(qǐng)求。如果請(qǐng)求是一個(gè)“向前送觸發(fā)器請(qǐng)求”3021,該請(qǐng)求被送到從屬觸發(fā)監(jiān)視器3000”(圖30a)。如果請(qǐng)求是“更新對(duì)象請(qǐng)求”3022,新的對(duì)象被通過cache_object(高速緩存對(duì)象)410API(圖4)傳送給遠(yuǎn)程高速緩存管理器3001。如果請(qǐng)求是“刪除遠(yuǎn)程對(duì)象請(qǐng)求”3025,則對(duì)象3004被通過delete_object(刪除對(duì)象)420API(圖4)從遠(yuǎn)程高速緩存管理器3001中清除出去。圖30c描述了觸發(fā)監(jiān)視器3000的另一例。這里,觸發(fā)監(jiān)視器3000被作為從屬觸發(fā)監(jiān)視器3000”的具體實(shí)例。如果主觸發(fā)監(jiān)視器3000’只是維護(hù)一個(gè)系統(tǒng),或者如果要重新產(chǎn)生對(duì)象3004(即不刪除它),則該系統(tǒng)能被圖30b描述的過程完全地維護(hù)。如果觸發(fā)管理器3000是維護(hù)多重系統(tǒng),則有可能對(duì)3004存在于某些但不是所有高速緩存中。特別是,對(duì)象3004可能不存在于接收觸發(fā)事件3020的觸發(fā)監(jiān)視器3000所在的同一高速緩存中。為對(duì)付這種情況,在每個(gè)被配置的節(jié)點(diǎn)上運(yùn)行一個(gè)從屬觸發(fā)監(jiān)視器3000”(圖30c)。如所描述的那樣,從屬觸發(fā)監(jiān)視器3000”接收一個(gè)向前傳送觸發(fā)請(qǐng)求3021。這一處理與觸發(fā)事件3020是完全相同的,直至它到達(dá)對(duì)象發(fā)生器3042。如果對(duì)象分配塊3100有一請(qǐng)求分配3103等于DispRegenerate3130,該請(qǐng)求被放棄。如果請(qǐng)求分配3101是DispInvalidate3131,則建立“刪除本機(jī)對(duì)象請(qǐng)求3023”并發(fā)送給從屬觸發(fā)監(jiān)視器的本機(jī)高速緩存。再次參考圖30,觸發(fā)監(jiān)視器3000最好是作為單個(gè)長(zhǎng)運(yùn)行過程來實(shí)現(xiàn),監(jiān)視對(duì)象源3050。本行專家不難使本發(fā)明適應(yīng)于每個(gè)部分包含一個(gè)或多個(gè)過程,其中一些可以在時(shí)間上重迭以改善系統(tǒng)的吞吐能力。本行專家還不難使本發(fā)明適應(yīng)于在單一過程中使用多線程,每個(gè)線程實(shí)現(xiàn)一個(gè)或多個(gè)組成部分,一些線程可以在時(shí)間上重迭,如果底層系統(tǒng)支持線程過程的話。當(dāng)收到觸發(fā)事件3020和向前發(fā)送觸發(fā)請(qǐng)求3021時(shí),最好使用傳統(tǒng)的機(jī)制,如多階段提交和不變數(shù)據(jù)對(duì)象,來向?qū)ο笤?050保證這些請(qǐng)求一旦被傳送便在系統(tǒng)中保持直至完成。最好使用傳統(tǒng)的機(jī)制,如重試和多階段提交,以保證在系統(tǒng)中保持被排隊(duì)的向外出的請(qǐng)求(圖30e描述的)直至完成。對(duì)象ID分析(OIA)部分3041把對(duì)象ID3009翻譯成對(duì)象分配塊3100(圖31)。OLA3041可以作為一個(gè)配置選擇或一個(gè)API或以任何其他標(biāo)準(zhǔn)方式來指定和通過接口連接。本行專家能容易地建立這種機(jī)制。對(duì)象發(fā)生器3042把對(duì)象分配塊(3100)中的信息翻譯成圖30c和下文中描述的事務(wù)類型。觸發(fā)監(jiān)視器3000使用配置選項(xiàng)對(duì)這一組成部分提供接口。對(duì)象發(fā)生器3042的實(shí)例是如下產(chǎn)品IBM以NETDATA為商標(biāo)的產(chǎn)品;Lotus公司以DOMINO服務(wù)器為商標(biāo)的產(chǎn)品;或能從中提取HTML頁面的任何萬維網(wǎng)服務(wù)器。圖30d描述send_trigger(發(fā)送觸發(fā)器)API的舉例。如所描述的那樣,send_trigger3026API使對(duì)象源3050能與觸發(fā)監(jiān)視器驅(qū)動(dòng)器3040通信。send_trigger3026API發(fā)送包括足夠信息(消息參數(shù))的消息以唯一地標(biāo)識(shí)該觸發(fā)器并構(gòu)成觸發(fā)事件3020。本行專家能容易地用標(biāo)準(zhǔn)性技術(shù)(如可變長(zhǎng)參數(shù)列表)來定義和指定這一信息。圖30e描述根據(jù)本發(fā)明所用的事務(wù)類型舉例。如所描述的那樣,在系統(tǒng)內(nèi)能產(chǎn)生若干事務(wù)3020…3025。觸發(fā)事件3020是響應(yīng)通過send_trigger3026API發(fā)送的消息被收到而產(chǎn)生的。觸發(fā)事件3020是一個(gè)結(jié)構(gòu),它包含足夠的信息以把send_trigger3026API發(fā)送的數(shù)據(jù)翻譯成一個(gè)或多個(gè)“顯示依賴對(duì)象請(qǐng)求”3024和適當(dāng)?shù)赝ㄟ^系統(tǒng)跟蹤與引導(dǎo)本身。向前傳送觸發(fā)請(qǐng)求3021是響應(yīng)通過send_trigger3026API發(fā)送的觸發(fā)事件3020的接收而產(chǎn)生的。向前傳送觸發(fā)請(qǐng)求3021是一個(gè)結(jié)構(gòu),它維持足夠的信息以產(chǎn)生一個(gè)或多個(gè)顯示依賴對(duì)象請(qǐng)求3024并適當(dāng)?shù)赝ㄟ^系統(tǒng)跟蹤與引導(dǎo)它本身。由對(duì)象發(fā)生器3042產(chǎn)生“更新對(duì)象請(qǐng)求”3022,以使新對(duì)象通過分布管理器3043分布到遠(yuǎn)程高速緩存管理器3002。更新對(duì)象請(qǐng)求是一個(gè)結(jié)構(gòu),它維持足夠的信息去替換任意高速緩存3003中的對(duì)象3004。由對(duì)象發(fā)生器產(chǎn)生“刪除本機(jī)對(duì)象請(qǐng)求”3023,以使本機(jī)高速緩存3003刪除對(duì)象3004。刪除本機(jī)對(duì)象請(qǐng)求3023是一個(gè)結(jié)構(gòu),它維持足夠的信息從本機(jī)高速緩存管理器3001中刪除對(duì)象3004?!帮@示依賴對(duì)象請(qǐng)求”3024是由觸發(fā)監(jiān)視器驅(qū)動(dòng)器3040響應(yīng)觸發(fā)事件3020而產(chǎn)生的,用以從本機(jī)高速緩存管理器3001請(qǐng)求依賴關(guān)系信息。顯示依賴對(duì)象請(qǐng)求3024是一個(gè)結(jié)構(gòu),它維持足夠的信息以分析觸發(fā)事件3020或向前傳送觸發(fā)器請(qǐng)求3021,并調(diào)用API函數(shù)show_dependent_objects(顯示依賴對(duì)象)3024來從本機(jī)高速緩存管理器3001獲取對(duì)象ID3009。“刪除遠(yuǎn)程對(duì)象請(qǐng)求”3025是由對(duì)象發(fā)生器3042產(chǎn)生的,它引起通過分布管理器3043從遠(yuǎn)程高速緩存管理器3002中刪除一對(duì)象3004。刪除遠(yuǎn)程對(duì)象請(qǐng)求是一個(gè)結(jié)構(gòu),它維持足夠的信息以從任意高速緩存3003中刪除一對(duì)象3004。圖33描述了觸發(fā)監(jiān)視驅(qū)動(dòng)器3040和分布管理器3043的高級(jí)組織和通信路徑。最佳組織是由若干個(gè)獨(dú)立執(zhí)行的控制線程組成的接收線程3300接收請(qǐng)求,包括觸發(fā)事件3020和向前傳送觸發(fā)器請(qǐng)求3021,并把它們存入某個(gè)永久存儲(chǔ)器。到來任務(wù)分送線程3320對(duì)來自3300的到來請(qǐng)求解除隊(duì)列,并把它們編隊(duì)以便處理。管理器通信線程3340把“刪除本機(jī)對(duì)象請(qǐng)求”3023和“顯示依賴對(duì)象請(qǐng)求”3024發(fā)送給本機(jī)高速緩存管理器3060。對(duì)象發(fā)生器線程3360協(xié)調(diào)如下對(duì)象請(qǐng)求的產(chǎn)生刪除遠(yuǎn)程對(duì)象請(qǐng)求3025;更新對(duì)象請(qǐng)求3022,并把它們排隊(duì)以便分發(fā)出去。分布線程3080(它是分布管理器3043的主要組成部分)對(duì)來自分布管理器隊(duì)列3370的請(qǐng)求解除隊(duì)列,并把它們排隊(duì)到所有遠(yuǎn)處的機(jī)器上。“外部事務(wù)”線程3395接觸遠(yuǎn)程機(jī)器并把機(jī)外部隊(duì)列3390上排隊(duì)的工作向前方傳送。如傳統(tǒng)的那樣,這些線程能通過若干FIFO隊(duì)列進(jìn)行通信到達(dá)請(qǐng)求隊(duì)列3310;高速緩存管理器請(qǐng)求隊(duì)列3330;對(duì)象發(fā)生器隊(duì)列3350;分布管理器隊(duì)列3370;以及機(jī)器外部隊(duì)列3390(每個(gè)分布式高速緩存有一個(gè))。圖34描述接收線程3300邏輯的舉例。如所描述的那樣,在步驟3410,一個(gè)到達(dá)消息(或者是send_triggerAPI3026,或者是向前發(fā)送觸發(fā)器請(qǐng)求3021)進(jìn)入系統(tǒng)并被轉(zhuǎn)換成觸發(fā)事件3020。在步驟3420,由接收線程3300把消息寫入永久隊(duì)列3450,并在步驟3430排隊(duì)到到達(dá)請(qǐng)求隊(duì)列3310。在步驟3440,檢驗(yàn)請(qǐng)求類型。在步驟3460,如果它是一個(gè)觸發(fā)事件3020,則一個(gè)向前傳送觸發(fā)請(qǐng)求3021被排隊(duì)到分布管理器隊(duì)列3370。在步驟3490,接收線程3300返回到等待3490以等待任務(wù)。圖35描述了到達(dá)任務(wù)分解線程3320邏輯的舉例。如所描述的那樣,在步驟3510,到達(dá)任務(wù)分解線程3320對(duì)任務(wù)請(qǐng)求解除隊(duì)列。在步驟3520,一個(gè)顯示依賴對(duì)象請(qǐng)求3024被排隊(duì)到高速緩存管理器請(qǐng)求隊(duì)列3330。在步驟3590,接收線程3300返回等待任務(wù)。圖36描述了高速緩存管理器通信線程3340邏輯的舉例。如所描述的那樣,高速緩存管理器通信線程3340把下一個(gè)請(qǐng)求解除隊(duì)列,并建立與本機(jī)高速緩存管理器3001的通信。在步驟3023,如果該請(qǐng)求是刪除本機(jī)對(duì)象請(qǐng)求,則在步驟3650,使用delete_object420API從本機(jī)高速緩存3003中刪除該對(duì)象。在步驟3024,如果該請(qǐng)求是顯示依賴對(duì)象請(qǐng)求,則在步驟3620,使用show_dependent_objects460API提取對(duì)象ID3009。在步驟3630,對(duì)象ID3009被傳送到對(duì)象ID分析部分3042,它建立一個(gè)對(duì)象分配塊3100。在步驟3640,對(duì)象分配塊3100被排隊(duì)到對(duì)象發(fā)生器3043。最后,在步驟3690,高速緩存管理器通信線程3340返回3690等待任務(wù)。圖37描述對(duì)象發(fā)生器線程3360邏輯的舉例。如所描述的那樣,在步驟3710,對(duì)象發(fā)生器線程3360將下一個(gè)請(qǐng)求從隊(duì)列3350中解除。在步驟3720,檢驗(yàn)對(duì)象的分配。如果它是DispInvalidate3131,則進(jìn)入步驟3750;如果是DispRegenerate3130,則進(jìn)入步驟3730。在步驟3730,檢驗(yàn)請(qǐng)求類型。如果它是向前傳送觸發(fā)器請(qǐng)求3021,則進(jìn)入步驟3770;如果它是觸發(fā)事件3020,則進(jìn)入步驟3740。在步驟3740,數(shù)據(jù)源3050被接觸以產(chǎn)生對(duì)象3004。由更新對(duì)象請(qǐng)求3022把新對(duì)象3004排隊(duì)到分布管理器隊(duì)列3370。然后過程返回步驟3790等待任務(wù)。在步驟3750,檢驗(yàn)請(qǐng)求類型。如果它是向前傳送觸發(fā)器請(qǐng)求3021,則進(jìn)入步驟3780;如果它是觸發(fā)事件3020,則進(jìn)入步驟3760。在步驟3760,建立一個(gè)刪除遠(yuǎn)程對(duì)象請(qǐng)求3024并排隊(duì)到分布管理器隊(duì)列3370。然后過程返回步驟3790等待任務(wù)。在步驟3770,請(qǐng)求被從系統(tǒng)中刪除。然后過程返回步驟3790等待任務(wù)。在步驟3780,刪除本機(jī)對(duì)象請(qǐng)求3023被排隊(duì)到高速緩存管理器請(qǐng)求隊(duì)列3330。然后過程返回步驟3790等待任務(wù)。圖38描述分布管理器線程3380邏輯的舉例。如所描述的那樣,在步驟3810,分布管理器線程3380把任務(wù)從分布管理器隊(duì)列3370中解除,并把該請(qǐng)求的副本排隊(duì)到每個(gè)機(jī)器外部線程3390。然后過程返回步驟3790等待業(yè)務(wù)。圖39描述向外事務(wù)線程3395邏輯的舉例。每個(gè)參加分布式更新機(jī)制的機(jī)器有一個(gè)向外事務(wù)線程3395。如所描述的那樣,在步驟3910,該線程把任務(wù)從機(jī)器外部隊(duì)列3390中解除,并檢驗(yàn)請(qǐng)求類型。在步驟3920,如果它是更新對(duì)象請(qǐng)求3022或刪除遠(yuǎn)程對(duì)象請(qǐng)求3025,則過程繼續(xù)到步驟3920;如果它是向前傳送觸發(fā)請(qǐng)求3021,則過程繼續(xù)到步驟3930。在步驟3930,如果它是向前傳送觸發(fā)請(qǐng)求3021,則過程繼續(xù)到步驟3930。在步驟3920,遠(yuǎn)程高速緩存管理器3001被接觸。在步驟3940,如果該請(qǐng)求是更新對(duì)象請(qǐng)求3022,則使用cache_object410API把新對(duì)象3004發(fā)送到遠(yuǎn)程高速緩存管理器3002。然后過程返回步驟3990等待任務(wù)。在步驟3950,如果該請(qǐng)求是刪除遠(yuǎn)程對(duì)象請(qǐng)求3025,則使用delete_object420API從遠(yuǎn)程高速緩存管理器3002中刪除對(duì)象3004。然后過程返回步驟3990等待任務(wù)。在步驟3930,遠(yuǎn)程觸發(fā)監(jiān)視器3000a被接觸。在步驟3960,該向前傳送觸發(fā)器請(qǐng)求3021被送到遠(yuǎn)程觸發(fā)監(jiān)視器3000。然后過程返回步驟3990等待任務(wù)。然后過程返回步驟3790等待任務(wù)。擴(kuò)展和變體根據(jù)本發(fā)明的具體應(yīng)用,可能需要這里沒有迭代過的其他出口以充分地分析觸發(fā)事件3020和翻譯成行動(dòng)(例如更新對(duì)象請(qǐng)求3022或刪除遠(yuǎn)程對(duì)象請(qǐng)求3025)。例如,現(xiàn)在參考圖40a)通過一個(gè)出口把單個(gè)觸發(fā)事件3020翻譯(4000)成一組多個(gè)顯示依賴對(duì)象請(qǐng)求3024,這可能是有用的;b)在更新對(duì)象請(qǐng)求3022中把對(duì)象3004排隊(duì)之前,對(duì)這個(gè)由對(duì)象發(fā)生器3042創(chuàng)建的對(duì)象3004進(jìn)行修改和分析(4010)可能是有用的;以及c)把對(duì)象3004寫入文件系統(tǒng),以替代把對(duì)象3004寫入高速緩存3003,或作為寫入高速緩存3003的補(bǔ)充,這可能是有用的。觸發(fā)監(jiān)視器3000的另一用途將是重新使用它的能力來產(chǎn)生和分布對(duì)象,以處理那些當(dāng)前可能在高速緩存中不存在的對(duì)象a)能使用一個(gè)prime_cache(初級(jí)高速緩存)API4020來產(chǎn)生和分布一個(gè)給定對(duì)象ID3009的對(duì)象3004,不論該對(duì)象3004當(dāng)前是否為任何高速緩存3003所知道;以及b)能使用一個(gè)global_delete(全局刪除)API4030來保證一些特定對(duì)象3004從系統(tǒng)中的所有高速緩存1中被刪除,而不需知道該對(duì)象是否實(shí)際存在于任何地方。觸發(fā)監(jiān)視器3000可以被實(shí)現(xiàn)來執(zhí)行嚴(yán)格的FIFO順序和處理請(qǐng)求,或允許完全異步處理請(qǐng)求,或者按任何公知的時(shí)間安排方案來處理請(qǐng)求,或者按上述各種方式的任何組合。維持一致性如前所述,盡管這里所用的術(shù)語含有字典上的意義,但這里對(duì)一些術(shù)語提供如下詞匯表作為指導(dǎo)事務(wù)管理器(transactionmanager)是一個(gè)管理狀態(tài)的程序。例如包括管理高速緩存的高速緩存管理器;數(shù)據(jù)庫管理系統(tǒng)(如DB2);以及事務(wù)處理系統(tǒng)(如CICS)。事務(wù)(transaction)是由另一個(gè)程序向一個(gè)事務(wù)管理器發(fā)出的請(qǐng)求。變狀態(tài)事務(wù)(state_chagingtransaction)是一個(gè)事務(wù),它改變由事務(wù)監(jiān)視器管理的狀態(tài)。向高速緩存管理器提出的讀、更新或刪除高速緩存對(duì)象的請(qǐng)求會(huì)構(gòu)成事務(wù)。讀數(shù)據(jù)或修改數(shù)據(jù)被稱作訪問(access)。鎖(lock)是一個(gè)實(shí)體,它限制過程讀或?qū)懝蚕頂?shù)據(jù)的能力。當(dāng)一個(gè)過程得到對(duì)一片數(shù)據(jù)的讀鎖時(shí),其他過程能訪問這些數(shù)據(jù),但沒有任何其他過程可以修改這數(shù)據(jù)。當(dāng)一個(gè)過程得到對(duì)數(shù)據(jù)寫或排他鎖,則沒有任何其他過程可以讀或修改該數(shù)據(jù)。在先有技術(shù)中存在若干方法來實(shí)現(xiàn)鎖,例如參見由Hennessy和Patterson寫的“計(jì)算機(jī)結(jié)構(gòu)一種定量手段”,第二版,MorganKaufmann,1996。設(shè)S是一組事務(wù),它們修改含有一個(gè)或多個(gè)事務(wù)管理器的系統(tǒng)上的數(shù)據(jù)。如果滿足下列條件,則S是被一致性地完成的(1)對(duì)于不屬于S的任何其他請(qǐng)求r1,它訪問d的全部或部分,被r1訪問的d的所有部分或者處在被S中任何事務(wù)修改之前的狀態(tài)或者處于被S中所有事務(wù)修改之后的狀態(tài)。(2)對(duì)于不屬于S的任何請(qǐng)求r1和r2,這里r2或與r1同時(shí)或在r1之后被系統(tǒng)接受,而且r1和r2二者訪問d的子集d’,(a)如果被r1訪問的d’版本已被S中的事務(wù)修改過,那么被r2訪問的d’版本也已被S中的事務(wù)修改過。(b)如果被r2訪問的d’版本當(dāng)未被S中的事務(wù)修改過,那么被r1訪問的d’版本也尚未被S中的事務(wù)修改過。時(shí)標(biāo)(timestamp)是一個(gè)屬性,能被賦予事件,如被系統(tǒng)接受的事務(wù)或被獲得的鎖。在先有技術(shù)中實(shí)現(xiàn)時(shí)間標(biāo)記的一般方法包括時(shí)鐘計(jì)時(shí)和對(duì)事件排序的數(shù)字。本發(fā)明的另一特點(diǎn)是對(duì)一個(gè)或多個(gè)高速緩存造成一組一致性更新的能力。本發(fā)明被用于把一組請(qǐng)求S應(yīng)用到一個(gè)或多個(gè)高速緩存管理器3001,這里的如下特性是人們所希望的(1)對(duì)訪問系統(tǒng)的任何程序P,必須自動(dòng)地造成S。就是說,P不能看到一些S中的請(qǐng)求已被滿足而另一些尚未被滿足的系統(tǒng)視圖(view)。(2)對(duì)同時(shí)被適當(dāng)?shù)母咚倬彺婀芾砥?001接受的任何兩個(gè)請(qǐng)求r1和r2,r1和r2關(guān)于S看到同一個(gè)系統(tǒng)視圖。就是說,或者r1和r2二者看到的是S中請(qǐng)求已被滿足之前的系統(tǒng)視圖,或者r1和r2二者看到的是S中請(qǐng)求已被滿足之后的系統(tǒng)視圖。(3)對(duì)于任何兩個(gè)請(qǐng)求r1和r2,這里r2被高速緩存管理器3001接收是在r1被高速緩存管理器接收之后,如果r1看到的系統(tǒng)是在S中請(qǐng)求已被滿足之后的系統(tǒng)視圖,那么r2必須看到的是該系統(tǒng)的同一視圖。如果r2看到的是S中請(qǐng)求被滿足之前的系統(tǒng)視圖,那么r1必須看到這同一視圖。圖41描述了對(duì)于含有一個(gè)或多個(gè)高速緩存的系統(tǒng)一致性地造成一組請(qǐng)求S的邏輯的舉例。最好是S中每個(gè)請(qǐng)求被指向一個(gè)高速緩存管理器3001。這一組接受來自S的一個(gè)請(qǐng)求的高速緩存管理器C可以有一個(gè)或多個(gè)成員。如所描述的那樣,在步驟4500,一組請(qǐng)求S被系統(tǒng)接受。每個(gè)請(qǐng)求被指向一個(gè)特定的高速緩存管理器3001。在步驟4505,高速緩存管理器鎖住數(shù)據(jù)。對(duì)于每個(gè)從S接受一個(gè)請(qǐng)求的高速緩存管理器j,高速緩存管理器j獲得對(duì)于被S中一請(qǐng)求修改的數(shù)據(jù)的寫鎖,和對(duì)于被S中一請(qǐng)求讀但不被S中一請(qǐng)求寫的數(shù)據(jù)的讀鎖。在這一步中被鎖住的數(shù)據(jù)將在下文中稱作被鎖數(shù)據(jù)。在步驟4600,系統(tǒng)確定最后一次獲得鎖的時(shí)間、last_lock_time。如果從S中接受一個(gè)請(qǐng)求的這組高速緩存管理器C只有一個(gè)成員,則能用先有技術(shù)容易地實(shí)現(xiàn)這一步驟。如果C有多個(gè)成員,則按圖42中描述的方式確定last_lock_time。在步驟4510,在last_lock_time之前收到的正在等待被鎖數(shù)據(jù)的請(qǐng)求被完成。在步驟4520,S中的請(qǐng)求被完成。在步驟4530,從被鎖數(shù)據(jù)中去掉鎖,這允許在last_lock_time之后收到的等待被鎖住數(shù)據(jù)的請(qǐng)求被完成。步驟4510、4520及4530必須按順序完成。與圖41描述的不同的另一實(shí)施例是使用單個(gè)鎖來防止請(qǐng)求去訪問被S中一請(qǐng)求訪問的數(shù)據(jù)。最佳實(shí)施例允許的并發(fā)級(jí)別比這另一個(gè)途徑要高得多。圖42描述了當(dāng)從S接收請(qǐng)求的一組高速緩存管理器C有多個(gè)成員時(shí)確定last_lock_time的邏輯的舉例。如所描述的那樣,在步驟4600,表示為cachemgri的C的每個(gè)成員確定它在步驟4505獲得最后的鎖的時(shí)間last_lock_time_i;然后高速緩存管理器cachemgri把last_lock_time_i發(fā)送給一個(gè)稱作協(xié)調(diào)程序的程序。在步驟4610,協(xié)調(diào)程序從C中所有高速緩存管理器接收last_lock_time_i之值,并把last_lock_time設(shè)成它收到的最近的一個(gè)last_lock_time_i。在步驟4615,協(xié)調(diào)程序把last_lock_time發(fā)送到C中所有高速緩存管理器。圖42中描述的舉例的一個(gè)變體是在步驟4600中由C中每個(gè)高速緩存管理器i以last_lock_time_i之值與C中其他高速緩存管理器進(jìn)行交換,用來代替把last_lock_time_i發(fā)送給協(xié)調(diào)程序。在步驟4610,C中每個(gè)高速緩存管理器i將根據(jù)它收到的last_lock_time_i值來確定last_lock_time。步驟4615將是不必要的。當(dāng)C大時(shí)該最佳實(shí)施例需要較少的通信和較少的比較次數(shù),因而比剛才描述的變體更具可伸縮性。本行專家不難采用本發(fā)明在其他含有一個(gè)或多個(gè)事務(wù)管理器的系統(tǒng)中實(shí)現(xiàn)一致性,這里的事務(wù)管理器不一定必須是高速緩存管理器。既然已經(jīng)通過詳細(xì)描述加上替代物描述了本發(fā)明,各種擴(kuò)充、變體和等效物對(duì)于本行專家而言就變得顯而易見了。這樣便會(huì)理解,詳細(xì)描述是以舉例方式提供的,因而不是一種限制。本發(fā)明的合適范圍由權(quán)利要求適當(dāng)?shù)卮_定。權(quán)利要求1.在包括一個(gè)或多個(gè)高速緩存以存儲(chǔ)一個(gè)或多個(gè)復(fù)雜對(duì)象的計(jì)算機(jī)系統(tǒng)中,一種確定底層數(shù)據(jù)的改變?nèi)绾斡绊懸粋€(gè)或多個(gè)復(fù)雜對(duì)象之值的方法,其特點(diǎn)在于它由以下步驟組成識(shí)別至少一部分底層數(shù)據(jù),這里的底層數(shù)據(jù)可以是或可以不是可高速緩存的;以及把所述至少一部分底層數(shù)據(jù)映射到一個(gè)或多個(gè)所述復(fù)雜對(duì)象,這些對(duì)象對(duì)所述至少一部分底層數(shù)據(jù)有一個(gè)或多個(gè)數(shù)據(jù)依賴關(guān)系。2.權(quán)利要求1的方法,特點(diǎn)在于還包括多個(gè)計(jì)算機(jī),這里伴隨第一高速緩存的第一組計(jì)算機(jī)與伴隨所述映射步驟的第二組計(jì)算機(jī)分離。3.權(quán)利要求1的方法,特點(diǎn)在于還包括步驟維持一個(gè)對(duì)象依賴關(guān)系圖(G),它可以隨時(shí)間改變,而且它包括多個(gè)圖對(duì)象和指示圖對(duì)象之間一個(gè)或多個(gè)數(shù)據(jù)依賴關(guān)系的邊緣。4.權(quán)利要求1的方法,特點(diǎn)在于所述映射步驟還包括由程序安排的操作時(shí)間表的步驟,這里不同的時(shí)間表會(huì)造成對(duì)底層數(shù)據(jù)的不同的改變。5.權(quán)利要求4的方法,特點(diǎn)在于所述安排操作時(shí)間表的程序是一個(gè)編譯器、運(yùn)行時(shí)系統(tǒng)或數(shù)據(jù)庫。6.權(quán)利要求3的方法,特點(diǎn)在于所述映射步驟包括使用所述圖把所述至少一部分底層數(shù)據(jù)映射到至少一個(gè)復(fù)雜對(duì)象。7.權(quán)利要求3的方法,特點(diǎn)在于還包括對(duì)邊緣賦予權(quán)的步驟,這里的權(quán)與數(shù)據(jù)依賴關(guān)系的重要性相關(guān)聯(lián)。8.權(quán)利要求7的方法,特點(diǎn)在于至少一個(gè)邊緣的權(quán)在被賦予之后是不改變的。9.權(quán)利要求7的方法,特點(diǎn)在于(1)一個(gè)圖對(duì)象o1存在兩個(gè)版本o1_v1和o1_v2;以及(2)對(duì)象依賴關(guān)系圖G包含至少一個(gè)邊緣(o2,o1)終止于o1并有被賦予的權(quán);而且還包含以下步驟對(duì)于終止于所述o1并由一個(gè)集合S組成的一個(gè)或多個(gè)邊緣(o2,o1),保持所述對(duì)象o2的一個(gè)版本號(hào),它與o1_v1一致;保持所述對(duì)象o2的第二版本號(hào),它與o1_v2一致;基于所述集合S中邊緣(o2,o1)的權(quán)之和,確定o1_v1和o1_v2的相似程度,從而使所述圖對(duì)象o2的同一版本與所述版本o1_v1和o1_v2以及所述集合S中所有終止于o1的邊緣的權(quán)和相一致。10.權(quán)利要求9的方法,特點(diǎn)在于所述確定兩個(gè)版本相似程度的步驟還包括把所述集合S中的邊緣(o2,o1)權(quán)之和分割的步驟,從而借助所述集合S中終止于o1的所有邊緣的權(quán)之和來使所述圖對(duì)象o2的同一版本與所述版本o1_v1和o1_v2一致。11.權(quán)利要求1的方法,特點(diǎn)在于所述映射還包括以下步驟利用關(guān)于一個(gè)或多個(gè)復(fù)雜對(duì)象如何受所述至少一部分底層數(shù)據(jù)改變的影響的信息,確定是否或如何造成對(duì)所述至少一部分底層數(shù)據(jù)的改變。12.權(quán)利要求1的方法,特點(diǎn)在于實(shí)現(xiàn)所述映射步驟的程序產(chǎn)生一個(gè)或多個(gè)多重過程、多重線程、以及管理所述一個(gè)或多個(gè)高速緩存存儲(chǔ)器的一個(gè)或多個(gè)長(zhǎng)運(yùn)行過程或線程。13.權(quán)利要求1的方法,特點(diǎn)在于所述映射步驟還包括如下步驟識(shí)別對(duì)所述至少一部分底層數(shù)據(jù)的改變;以及響應(yīng)所述識(shí)別對(duì)所述至少一部分底層數(shù)據(jù)的改變,識(shí)別一個(gè)或多個(gè)復(fù)雜對(duì)象受影響程度。14.權(quán)利要求12的方法,特點(diǎn)在于實(shí)現(xiàn)所述映射步驟的程序產(chǎn)生至少一個(gè)長(zhǎng)運(yùn)行過程,而且還包括以下步驟一個(gè)應(yīng)用程序識(shí)別對(duì)至少一部分底層數(shù)據(jù)的改變;以及該應(yīng)用程序把識(shí)別出的對(duì)至少一部分底層數(shù)據(jù)的改變通知給所述實(shí)現(xiàn)所述映射步驟的程序。15.權(quán)利要求1的方法,特點(diǎn)在于還包括一個(gè)步驟,確定由于對(duì)所述至少一部分底層數(shù)據(jù)的改變使存儲(chǔ)在一高速緩存中的復(fù)雜對(duì)象的一個(gè)版本變?yōu)楦叨冗^時(shí)。16.權(quán)利要求15的方法,特點(diǎn)在于還包括一個(gè)步驟從高速緩存中刪除一個(gè)對(duì)象的高度過時(shí)版本。17.權(quán)利要求15的方法,特點(diǎn)在于每當(dāng)一個(gè)對(duì)象的版本不是當(dāng)前版本時(shí)便被認(rèn)為是高度過時(shí)的。18.權(quán)利要求15的方法,特點(diǎn)在于所述確定一個(gè)對(duì)象(o1_v1)的一個(gè)版本為高度過時(shí)由以下步驟組成維持一個(gè)對(duì)象依賴關(guān)系圖(G),它可以隨時(shí)間改變,而且它包括多個(gè)圖對(duì)象(o1…on)以及指示圖對(duì)象之間一個(gè)或多個(gè)依賴關(guān)系的邊緣;以及根據(jù)o1_v1與o2當(dāng)前版本不一致的邊緣(o2,o1)的個(gè)數(shù),確定所述o1_v1將變?yōu)楦叨冗^時(shí)。19.權(quán)利要求15的方法,特點(diǎn)在于還包括一個(gè)步驟以更新近的版本代替該對(duì)象的一個(gè)高度過時(shí)版本。20.權(quán)利要求19的方法,特點(diǎn)在于該更新近的版本是該對(duì)象的當(dāng)前版本。21.權(quán)利要求15的方法,特點(diǎn)在于所述確定存儲(chǔ)在高速緩存中的對(duì)象o1的一個(gè)版本o1_v1將變?yōu)楦叨冗^時(shí)的步驟由以下步驟組成維持一個(gè)對(duì)象依賴關(guān)系圖(G),它可以隨時(shí)間改變,而且它包括多個(gè)圖對(duì)象和指示圖對(duì)象之間一個(gè)或多個(gè)依賴關(guān)系的邊緣;為對(duì)應(yīng)于一個(gè)或多個(gè)終止于所述o1的邊緣的所述o1_v1,初始化和維持weight_act字段;對(duì)于一個(gè)圖對(duì)象o2的當(dāng)前版本的一個(gè)或多個(gè)改變,從所述對(duì)象o2到所述對(duì)象o1的邊緣存在,o1_v1有一weight_act字段,確定對(duì)應(yīng)于該邊緣的weight_act字段減量;以及根據(jù)其weight_act字段確定是否所述o1_v1會(huì)變?yōu)楦叨冗^時(shí)的。22.權(quán)利要求21的方法,特點(diǎn)在于還包括步驟對(duì)所述o1_v1維持一個(gè)閾值權(quán);這里所述基于其weight_act字段確定是否所述o1_v1會(huì)變?yōu)楦叨冗^時(shí)包括所述o1_v1的weight_act字段之和與所述閾值權(quán)比較的步驟。23.權(quán)利要求21的方法,特點(diǎn)在于還包括以下步驟對(duì)對(duì)象依賴關(guān)系圖的邊緣賦予權(quán),這里的權(quán)與數(shù)據(jù)依賴關(guān)系的重要性相關(guān)聯(lián);以及把所述o1_v1的一個(gè)或多個(gè)weight_act字段初始化為對(duì)象關(guān)系圖中相應(yīng)邊緣的一個(gè)或多個(gè)權(quán)。24.權(quán)利要求21的方法,特點(diǎn)在于還包括一個(gè)步驟,每當(dāng)o2的當(dāng)前版本被更新時(shí)把對(duì)應(yīng)于對(duì)象依賴關(guān)系圖中從所述o2到所述o1的邊緣的weight_act字段(它大于預(yù)先確定的最小可能值)設(shè)置成這個(gè)預(yù)先確定的最小可能值。25.權(quán)利要求1的方法,特點(diǎn)在于所述一個(gè)或多個(gè)高速緩存包括下列當(dāng)中的一個(gè)或多個(gè)一個(gè)多版本高速緩存;一個(gè)單版本高速緩存;以及一個(gè)當(dāng)前版本高速緩存。26.權(quán)利要求25的方法,特點(diǎn)在于所述一個(gè)或多個(gè)高速緩存包括至少一個(gè)單版本高速緩存c1,而且還包括以下步驟對(duì)于至少一個(gè)對(duì)象o1,維持其他對(duì)象o2的一致性集,使得每當(dāng)o1和o2都被包含在c1中時(shí)o1和o2必須是一致的。27.權(quán)利要求26的方法,特點(diǎn)在于還包括一個(gè)步驟,保證當(dāng)所述o1和所述o2都在c1中時(shí),所述o1和所述o2是一致的。28.權(quán)利要求27的方法,特點(diǎn)在于還包括以下步驟把所述對(duì)象o1的當(dāng)前版本添加到單版本高速緩存,可能代替對(duì)象o1的一個(gè)先前版本;識(shí)別o1的一致性集合中的一個(gè)或多個(gè)對(duì)象o2,這里所述高速緩存c1中包含所述對(duì)象o2的一個(gè)非當(dāng)前版本o2_v,而所述o2_v是在所述o1的當(dāng)前版本被創(chuàng)建之前被創(chuàng)建的;從所述高速緩存c1中刪除所述o2_v,或以所述對(duì)象o2的更新近版本替代o2_v;對(duì)所述對(duì)象o2的一致性集合中的對(duì)象遞歸地應(yīng)用所述識(shí)別一個(gè)或多個(gè)對(duì)象的步驟以及從所述高速緩存c1中刪除所述o2_v或以所述對(duì)象的更新近版本替代o2_v的步驟。29.權(quán)利要求26的方法,特點(diǎn)在于還包括以下步驟使用對(duì)象o1的一致性集合決定是否把對(duì)象o1的一個(gè)版本添加到單版本高速緩存,這可能替代對(duì)象o1的先前版本。30.權(quán)利要求27的方法,特點(diǎn)在于還包括以下步驟對(duì)于單版本高速緩存c1中的多重對(duì)象o1…on,以c1中的一個(gè)不同版本替代每個(gè)對(duì)象oi,而不保證在所述oi被更新時(shí)由對(duì)象oi的一致性集合所加的所有約束被滿足,但代之以把來自所述o1的一致性集合中的對(duì)象obj1添加到一個(gè)一致性堆棧中,對(duì)于obj1,obj1的不一致性版本可能存在于c1中;在c1中所有對(duì)象o1,…,on已被當(dāng)前版本替代后,遍歷一致性堆棧上的所有對(duì)象,并對(duì)于c1中存在非一致性版本的每個(gè)這種對(duì)象obj1,從c1中去掉它或以一致性版本替代它。31.權(quán)利要求3的方法,特點(diǎn)在于所述G是簡(jiǎn)單依賴關(guān)系圖和多重圖當(dāng)中的一個(gè)。32.權(quán)利要求31的方法,特點(diǎn)在于所述G是一個(gè)簡(jiǎn)單依賴關(guān)系圖,其中適當(dāng)?shù)淖畲蠊?jié)點(diǎn)是復(fù)雜對(duì)象,適當(dāng)?shù)娜~節(jié)點(diǎn)是不為對(duì)象的底層數(shù)據(jù)。33.權(quán)利要求32的方法,特點(diǎn)在于所述維持對(duì)象依賴關(guān)系圖由以下步驟組成對(duì)至少一個(gè)適當(dāng)葉節(jié)點(diǎn)ν維持一個(gè)外行相鄰列表;以及對(duì)至少一個(gè)適當(dāng)?shù)淖畲蠊?jié)點(diǎn)w維持一個(gè)到來相鄰列表。34.權(quán)利要求33的方法,特點(diǎn)在于還包括一個(gè)步驟通過散列表訪問外行相鄰列表和到來相鄰列表之一。35.權(quán)利要求33的方法,特點(diǎn)在于所述維持一個(gè)對(duì)象依賴關(guān)系圖還包括以下步驟當(dāng)初始改變的數(shù)據(jù)包括能被一適當(dāng)葉節(jié)點(diǎn)的改變所代表的某些數(shù)據(jù)d時(shí),查尋對(duì)應(yīng)于d的外行相鄰列表。如果找到了外行相鄰列表,檢驗(yàn)該列表以確定哪些復(fù)雜對(duì)象受到影響。36.權(quán)利要求33的方法,特點(diǎn)在于還包括一個(gè)步驟從對(duì)象依賴關(guān)系圖中刪除至少一個(gè)適當(dāng)?shù)淖畲蠊?jié)點(diǎn)w。37.權(quán)利要求36的方法,特點(diǎn)在于所述從對(duì)象依賴關(guān)系圖中刪除至少一個(gè)適當(dāng)?shù)淖畲蠊?jié)點(diǎn)w的步驟還包括以下步驟對(duì)于w的到來相鄰列表上的至少一個(gè)適當(dāng)葉節(jié)點(diǎn),從其外行相鄰列表中刪除所述w;對(duì)所述w,刪除其到來相鄰列表。38.權(quán)利要求33的方法,特點(diǎn)在于還包括從對(duì)象依賴關(guān)系圖中刪除至少一個(gè)適當(dāng)葉節(jié)點(diǎn)ν的步驟。39.權(quán)利要求38的方法,特點(diǎn)在于所述從對(duì)象依賴關(guān)系圖中刪除至少一個(gè)適當(dāng)葉節(jié)點(diǎn)ν的步驟進(jìn)一步包括以下步驟從對(duì)于ν的外行相鄰列表上的一個(gè)或多個(gè)適當(dāng)?shù)淖畲蠊?jié)點(diǎn)的到來相鄰列表中刪除ν;刪除所述ν的外行相鄰列表。40.權(quán)利要求3的方法,特點(diǎn)在于圖對(duì)象r是一個(gè)關(guān)系對(duì)象(RO),它有一個(gè)相關(guān)聯(lián)的關(guān)系指示,它能代表單(SRO)記錄或多重(MRO)記錄,而且所述維持一個(gè)對(duì)象依賴關(guān)系圖進(jìn)一步包括以下步驟(a)存儲(chǔ)所述r的關(guān)系指示;(b)如果一個(gè)或多個(gè)對(duì)象包括所述r,從所述r向包括所述r的一個(gè)或多個(gè)圖對(duì)象添加一個(gè)或多個(gè)依賴關(guān)系;以及(c)如果所述r包括一個(gè)或多個(gè)圖對(duì)象,從所述r包括的所述一個(gè)或多個(gè)圖對(duì)象向所述r添加一個(gè)或多個(gè)依賴關(guān)系。41.權(quán)利要求40的方法,特點(diǎn)在于還包括以下步驟對(duì)邊緣賦予權(quán),這里的權(quán)與數(shù)據(jù)依賴關(guān)系的重要性相關(guān)聯(lián);而且這里所述步驟(b)和(c)之一包括一個(gè)步驟確定對(duì)應(yīng)于包含RO節(jié)點(diǎn)r2的RO節(jié)點(diǎn)r1的至少一個(gè)依賴關(guān)系的權(quán),確定該權(quán)的依據(jù)是以下兩者之一或兩者所述r2包含的所述r1記錄所占的百分?jǐn)?shù);所述記錄的相對(duì)重要性。42.權(quán)利要求40的方法,還包括以下兩個(gè)步驟之一或二者(d)從所述r向另一ROr2添加一個(gè)或多個(gè)依賴關(guān)系,這里所述另一個(gè)ROr2不包括所述r,所用的度量基于以下兩點(diǎn)之一或二者也包含在所述r2中的所述r中記錄的百分?jǐn)?shù);也包含在所述r2中的所述r2中記錄的相對(duì)重要性。(e)從另一個(gè)ROr3向r添加一個(gè)或多個(gè)依賴關(guān)系,這里所述r不包括所述r3,所用的度量基于以下兩點(diǎn)之一或二者也包含在所述r中的所述r3中記錄的百分?jǐn)?shù);也包含在所述r中的所述r3中記錄的相對(duì)重要性。43.權(quán)利要求42的方法,特點(diǎn)在于還包括以下步驟對(duì)邊緣賦予權(quán),這里的權(quán)與數(shù)據(jù)依賴關(guān)系的重要性相關(guān)聯(lián);以及計(jì)算在步驟(d)和(e)二者之一或二者當(dāng)中使用所述度量添加的所述一個(gè)或多個(gè)依賴關(guān)系的權(quán)。44.權(quán)利要求40的方法,其特征在于所述r是下列之一一個(gè)新創(chuàng)建的節(jié)點(diǎn);一個(gè)被修改過的現(xiàn)存節(jié)點(diǎn);一個(gè)SRO節(jié)點(diǎn);以及一個(gè)MRO節(jié)點(diǎn)。45.權(quán)利要求40的方法,特點(diǎn)在于一個(gè)或多個(gè)關(guān)系指示包括關(guān)系名,使得有一共同記錄的RO派對(duì)以高概率具有同一關(guān)系名。46.權(quán)利要求45的方法,特點(diǎn)在于還包括利用下列之一分隔RO的步驟關(guān)系名;以及與關(guān)系名結(jié)合的平衡樹。47.權(quán)利要求40的方法,特點(diǎn)在于識(shí)別至少一部分底層數(shù)據(jù)的步驟包含以下步驟識(shí)別一個(gè)關(guān)系指示;以及在具有一個(gè)或多個(gè)與關(guān)系指示共同的記錄的對(duì)象依賴關(guān)系圖中定位一個(gè)或多個(gè)RO。48.權(quán)利要求3的方法,特點(diǎn)在于所述映射由以下步驟組成在對(duì)應(yīng)于所述至少一部分底層數(shù)據(jù)的對(duì)象依賴關(guān)系圖中訪問由一個(gè)或多個(gè)節(jié)點(diǎn)構(gòu)成的一組節(jié)點(diǎn)(updateset);以及遍歷對(duì)象依賴關(guān)系圖中的邊緣,以便訪問從所述updateset能達(dá)到的節(jié)點(diǎn)。49.權(quán)利要求48的方法,特點(diǎn)在于所述遍歷過程包括以下列方式之一遍歷對(duì)象依賴關(guān)系圖深度優(yōu)先方式;以及寬度優(yōu)先方式。50.權(quán)利要求48的方法,特點(diǎn)在于還包括以下步驟維持一個(gè)時(shí)間標(biāo)記,它唯一地標(biāo)識(shí)每個(gè)對(duì)象依賴關(guān)系圖的遍歷;每當(dāng)在遍歷過程中第一次訪問對(duì)象依賴關(guān)系圖中一個(gè)頂點(diǎn)時(shí),便在此頂點(diǎn)處存儲(chǔ)一個(gè)時(shí)間標(biāo)識(shí);以及通過比較在頂點(diǎn)處的時(shí)間標(biāo)記和當(dāng)前遍歷的時(shí)間標(biāo)識(shí),以確定在當(dāng)前遍歷過程中該頂點(diǎn)是否已被訪問過。51.權(quán)利要求50的方法,特點(diǎn)在于還包括對(duì)每個(gè)新的圖遍歷時(shí)的時(shí)間標(biāo)記增量。52.權(quán)利要求3的方法,特點(diǎn)在于圖對(duì)象o1的兩個(gè)版本o1_v1和o1_v2存在,對(duì)象依賴關(guān)系圖G包含至少一個(gè)終止于o1的邊緣(o2,o1),而且包含以下步驟對(duì)于終止在所述o1并包含一組S的一個(gè)或多個(gè)邊緣(o2,o1),維持一個(gè)所述對(duì)象o2的版本號(hào),它與o1_v1一致,以及所述對(duì)象o2的第二版本號(hào),它與o1_v2一致;基于所述S組中的邊緣(o2,o1)個(gè)數(shù),和所述S組中終止于o1的所有邊緣數(shù),確定o1_v1和o1_v2的相似程度,這里一個(gè)圖對(duì)象o2的同一版本與所述版本o1_v1及o1_v2一致。53.權(quán)利要求52的方法,特點(diǎn)在于確定o1_v1和o1_v2相似程度的步驟包括用所述S組中終止于o1的所有邊緣數(shù)去除所述S組中邊緣(o2,o1)的個(gè)數(shù),這里圖對(duì)象o2的同一版本與所述版本o1_v1和o1_v2一致。54.權(quán)利要求1的方法,特點(diǎn)在于至少一些對(duì)象是萬維網(wǎng)文件,而且至少一些底層數(shù)據(jù)是一個(gè)或多個(gè)數(shù)據(jù)庫的一部分。55.權(quán)利要求15的方法,特點(diǎn)在于確定存儲(chǔ)在一高速緩存中的一復(fù)雜對(duì)象o1的一個(gè)版本會(huì)是高度過時(shí)的步驟包含一個(gè)步驟確定邊緣(o2,o1)個(gè)數(shù),這里所述o1的版本與所述o2的當(dāng)前版本一致。56.權(quán)利要求55的方法,特點(diǎn)在于確定存儲(chǔ)在一高速緩存中的一復(fù)雜對(duì)象o1的一個(gè)版本會(huì)是高度過時(shí)的步驟還基于終止于所述o1的邊緣的總數(shù)。57.權(quán)利要求3的方法,特點(diǎn)在于還包括一個(gè)步驟利用關(guān)于一個(gè)或多個(gè)對(duì)象的一組supdate會(huì)如何受底層數(shù)據(jù)變化影響的信息,結(jié)合對(duì)象依賴關(guān)系圖,確定對(duì)所述s_update中的一個(gè)或多個(gè)對(duì)象有依賴關(guān)系,或者直接指定,或者由對(duì)象依賴關(guān)系圖間接指明,的至少一個(gè)其他圖對(duì)象會(huì)受到影響的程度。58.權(quán)利要求30的方法,特點(diǎn)在于還包括一個(gè)步驟,通過把對(duì)所述對(duì)象的訪問存儲(chǔ)在一個(gè)鏈接列表上來實(shí)現(xiàn)一致性堆棧。59.權(quán)利要求30的方法,特點(diǎn)在于還包括下列步驟使用一個(gè)或多個(gè)平衡樹來實(shí)現(xiàn)所述一致性堆棧;以及對(duì)于至少一個(gè)對(duì)象obj1,確證在把對(duì)所述obj1的訪問添加到一致性堆棧之前對(duì)所述obj1的訪問并沒有已經(jīng)包括在一致性堆棧中。60.權(quán)利要求26的方法,特點(diǎn)在于所述一致性集合是用一個(gè)或多個(gè)鏈接列表實(shí)現(xiàn)的。61.在包括一個(gè)或多個(gè)高速緩存以存儲(chǔ)一個(gè)或多個(gè)復(fù)雜對(duì)象的計(jì)算機(jī)系統(tǒng)中,有一個(gè)或多個(gè)遠(yuǎn)程數(shù)據(jù)源存儲(chǔ)底層數(shù)據(jù),這些底層數(shù)據(jù)可能影響一個(gè)或多個(gè)所述對(duì)象的當(dāng)前值,該方法的特點(diǎn)在于以下組成步驟維持一個(gè)對(duì)象依賴關(guān)系圖,它可能隨時(shí)間改變,而且它包括多個(gè)圖對(duì)象和指示所述圖對(duì)象之間一個(gè)或多個(gè)數(shù)據(jù)依賴關(guān)系的邊緣;識(shí)別出何時(shí)至少一部分所述底層數(shù)據(jù)已改變;向高速緩存通告以下信息中的一個(gè)或多個(gè)關(guān)于已改變的至少一部分底層數(shù)據(jù)的信息;以及包括由于所述底層數(shù)據(jù)已改變?cè)斐善渲狄迅淖兊闹辽僖粋€(gè)對(duì)象的標(biāo)識(shí)的信息;以及允許這個(gè)由于所述底層數(shù)據(jù)已改變?cè)斐善渲狄迅淖兊闹辽僖粋€(gè)對(duì)象的標(biāo)識(shí)能被確定所需的信息;以及響應(yīng)所述通告步驟,從而從高速緩存中去掉一個(gè)對(duì)象,或?qū)Ω咚倬彺嬷械膶?duì)象更新為新版本。62.權(quán)利要求13的方法,特點(diǎn)在于所述至少一部分底層數(shù)據(jù)被存儲(chǔ)在一個(gè)或多個(gè)遠(yuǎn)程數(shù)據(jù)源中,而且還包括以下步驟向高速緩存通告以下信息中的一個(gè)或多個(gè)關(guān)于已改變的至少一部分底層數(shù)據(jù)的信息;以及包括由于所述底層數(shù)據(jù)已改變?cè)斐善渲狄迅淖兊闹辽僖粋€(gè)對(duì)象的標(biāo)識(shí)的信息;以及允許這個(gè)由于所述底層數(shù)據(jù)已改變?cè)斐善渲狄迅淖兊闹辽僖粋€(gè)對(duì)象的標(biāo)識(shí)能被確定所需的信息;以及響應(yīng)所述通告步驟,從而從高速緩存中去掉一個(gè)對(duì)象,或?qū)Ω咚倬彺嬷械膶?duì)象更新為新版本。63.一個(gè)機(jī)器可讀的程序存儲(chǔ)裝置,真實(shí)地實(shí)現(xiàn)由該機(jī)器可執(zhí)行的指令程序,完成根據(jù)權(quán)利要求1-11,13,18,21-24,26-30,40,45,47,48或50中的任何項(xiàng)的方法步驟,以確定底層數(shù)據(jù)的改變?nèi)绾文苡绊懸粋€(gè)或多個(gè)復(fù)雜對(duì)象之值。全文摘要能夠確定底層數(shù)據(jù)的改變?nèi)绾斡绊憣?duì)象之值。應(yīng)用實(shí)例包括:高速緩存動(dòng)態(tài)萬維網(wǎng)頁;客戶機(jī)-服務(wù)器應(yīng)用,借助這些應(yīng)用,把對(duì)象(這些對(duì)象總在改變)發(fā)送到多個(gè)客戶機(jī)的服務(wù)器能跟蹤哪些版本被送到哪些用戶以及這些版本的過時(shí)程度;以及任何這樣的場(chǎng)合,那里需要維持和唯一地識(shí)別對(duì)象的若干版本,更新過時(shí)的對(duì)象,定量評(píng)估同一對(duì)象的兩個(gè)版本的差異程度,和/或在一組對(duì)象中維持其一致性。一個(gè)稱作對(duì)象依賴關(guān)系圖的有方向圖可被用來代替對(duì)象間的數(shù)據(jù)依賴關(guān)系。文檔編號(hào)G06F12/08GK1213800SQ98116759公開日1999年4月14日申請(qǐng)日期1998年7月31日優(yōu)先權(quán)日1997年8月1日發(fā)明者詹姆斯·羅伯特·哈羅德·查林杰,保羅·邁克爾·丹特茲格,阿魯·K·伊延加,杰拉爾德·A·斯皮瓦克申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司