一種基于觀察者模式的實時數(shù)據(jù)庫實時數(shù)據(jù)發(fā)布方法
【技術領域】
[0001]本發(fā)明涉及一種基于觀察者模式的實時數(shù)據(jù)庫實時數(shù)據(jù)發(fā)布方法,屬于計算機軟件技術領域。
【背景技術】
[0002]實時數(shù)據(jù)庫(RTDB — Real Time DataBase)是數(shù)據(jù)庫系統(tǒng)發(fā)展的一個分支,是數(shù)據(jù)庫技術結合實時處理技術產(chǎn)生的。實時數(shù)據(jù)庫是電力,能源,化工等工業(yè)控制場合所廣泛采用的實時控制系統(tǒng),數(shù)據(jù)采集與監(jiān)視系統(tǒng)等系統(tǒng)的核心部分,主要用于采集并管理來自各種采集設備的生產(chǎn)過程數(shù)據(jù),并提供統(tǒng)一的實時數(shù)據(jù)管理平臺,通常做為企業(yè)信息化管理系統(tǒng)中的核心和中樞,是企業(yè)實現(xiàn)從設備自動控制到高層計劃管理的橋梁,承擔著承上啟下的作用。
[0003]實時數(shù)據(jù)庫最重要的特性即是實時性,實時性包含數(shù)據(jù)的實時性和事務的實時性。數(shù)據(jù)的實時性主要和現(xiàn)場采集裝置,實時數(shù)據(jù)采集驅(qū)動模塊的速度、效率有關。事務實時性是指實時數(shù)據(jù)庫對事務處理的實時能力,包括響應客戶端訪問請求的速度,向客戶端發(fā)布實時數(shù)據(jù)的速度等。其他性能主要包括支持訪問客戶端數(shù)量,即并發(fā)訪問性能;對系統(tǒng)資源的占用,即通訊的效率等方面。
[0004]現(xiàn)有技術中客戶端實時獲得快速變化的實時數(shù)據(jù),需要頻繁訪問實時數(shù)據(jù)庫而占用較多服務器軟硬件系統(tǒng)資源,加重系統(tǒng)通訊網(wǎng)絡負擔。
【發(fā)明內(nèi)容】
[0005]為了解決上述技術問題,本發(fā)明提供了一種基于觀察者模式的實時數(shù)據(jù)庫實時數(shù)據(jù)發(fā)布方法。
[0006]為了達到上述目的,本發(fā)明所采用的技術方案是:
[0007]—種基于觀察者模式的實時數(shù)據(jù)庫實時數(shù)據(jù)發(fā)布方法,基于服務器-客戶端的架構,采用2級訂閱-發(fā)布機制,在服務器和客戶端分別內(nèi)置訂閱-發(fā)布模塊;
[0008]客戶端的訂閱-發(fā)布模塊:負責管理客戶端應用程序的訂閱請求,可注冊客戶端應用程序的訂閱請求,在收到服務器的實時數(shù)據(jù)發(fā)布后,向注冊的應用程序發(fā)布其訂閱的實時數(shù)據(jù);
[0009]服務器的訂閱-發(fā)布模塊:負責管理客戶端的訂閱請求,可注冊客戶端的訂閱請求,在實時數(shù)據(jù)滿足發(fā)布條件時,向注冊的客戶端發(fā)布其訂閱的實時數(shù)據(jù);
[0010]實時數(shù)據(jù)庫實時數(shù)據(jù)發(fā)布過程為,
[0011]1)客戶端應用程序向客戶端的訂閱-發(fā)布模塊訂閱實時數(shù)據(jù);
[0012]2)客戶端的訂閱-發(fā)布模塊接收并注冊客戶端應用程序的訂閱請求,并向服務器訂閱實時數(shù)據(jù);
[0013]3)服務器的訂閱-發(fā)布模塊接收并注冊客戶端的訂閱請求;
[0014]4)在實時數(shù)據(jù)滿足發(fā)布條件時,向訂閱該實時數(shù)據(jù)的客戶端發(fā)布;
[0015]5)客戶端的訂閱-發(fā)布模塊接收到服務器發(fā)布的實時數(shù)據(jù)時,向客戶端應用程序發(fā)布訂閱的實時數(shù)據(jù)。
[0016]客戶端的訂閱-發(fā)布模塊通過散列表和鏈表數(shù)據(jù)結構管理訂閱請求,其中,散列表以被訂閱數(shù)據(jù)的標簽名為鍵值,以訂閱該數(shù)據(jù)的客戶端應用程序句柄鏈表為值;
[0017]服務器的訂閱-發(fā)布模塊通過散列表和鏈表數(shù)據(jù)結構管理訂閱請求,其中,散列表以被訂閱數(shù)據(jù)的標簽名為鍵值,以訂閱該數(shù)據(jù)的客戶端信息鏈表為值。
[0018]客戶端的訂閱-發(fā)布模塊接受到客戶端應用程序的訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則獲得該數(shù)據(jù)對應的應用程序句柄鏈表,如果鏈表中不存在該應用程序句柄,則將新的訂閱請求的應用程序句柄加入到鏈表末端;如果該數(shù)據(jù)未被訂閱,則新建應用程序句柄鏈表,并在鏈表中加入該訂閱應用程序句柄,在散列表中新建被訂閱數(shù)據(jù)的標簽名和該鏈表的映射關系,同時向服務器發(fā)送訂閱請求;
[0019]服務器的訂閱-發(fā)布模塊在接收到客戶端的訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則獲得該數(shù)據(jù)所對應的客戶端信息鏈表;如果鏈表中不存在該客戶端信息,則將新的訂閱請求客戶端信息加入到鏈表末端;如果該數(shù)據(jù)沒有被訂閱,則需新建客戶端信息鏈表,并加入該客戶端信息,在散列表中新建被訂閱數(shù)據(jù)的標簽名和該鏈表的映射關系Ο
[0020]客戶端的訂閱-發(fā)布模塊還可注銷客戶端應用程序的訂閱請求,服務器的訂閱-發(fā)布模塊還可注銷客戶端的訂閱請求;
[0021]客戶端的訂閱-發(fā)布模塊收到客戶端應用程序的注銷訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則在散列表中獲得數(shù)據(jù)對應的應用程序句柄鏈表,遍歷鏈表,找到該應用程序句柄,并從鏈表中刪除該應用程序句柄;如果刪除后,鏈表為空,則說明客戶端中,已經(jīng)沒有應用程序訂閱該數(shù)據(jù),在散列表中刪除被注銷訂閱的數(shù)據(jù)標簽名和鏈表的映射關系,并刪除該鏈表,向服務器發(fā)出注銷訂閱請求;
[0022]服務器的訂閱-發(fā)布模塊接收到注銷訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則在散列表中獲得該數(shù)據(jù)對應的客戶端信息鏈表,遍歷鏈表,找到該客戶端信息,從鏈表中刪除該客戶端信息。
[0023]客戶端信息包括客戶端的IP地址和主機名稱信息。
[0024]觸發(fā)發(fā)布的發(fā)布條件為,實時數(shù)據(jù)變化范圍超過其變化死區(qū)或距離上次發(fā)布時間超過規(guī)定的超時等待時間。
[0025]實時數(shù)據(jù)從服務器發(fā)布到客戶端應用程序,時間復雜度為0(1)。
[0026]本發(fā)明所達到的有益效果:本發(fā)明通過2次訂閱-發(fā)布,實現(xiàn)了客戶端應用程序獲得服務器端實時數(shù)據(jù)的方法,一方面將客戶端應用程序與實時數(shù)據(jù)庫解耦,消除模塊之間的依賴關系,另一方面,避免了客戶端頻繁訪問服務器獲取實時數(shù)據(jù)帶來的時間消耗,硬件資源、網(wǎng)絡資源的開銷,在實時數(shù)據(jù)發(fā)生變化時,可立即發(fā)布訂閱的數(shù)據(jù)到客戶端程序;解決了現(xiàn)有訂閱-發(fā)布機制實時數(shù)據(jù)庫由應用程序直接向服務器訂閱數(shù)據(jù)帶來的大量冗余訂閱數(shù)據(jù)占用系統(tǒng)資源的問題,保證了數(shù)據(jù)的實時性,并支持了理論上無限量客戶端的并發(fā)訪問。
【附圖說明】
[0027]圖1為本發(fā)明的系統(tǒng)架構圖。
[0028]圖2為客戶端的訂閱-發(fā)布模塊示意圖。
[0029]圖3為服務器的訂閱-發(fā)布模塊示意圖。
[0030]圖4為本發(fā)明的流程圖。
【具體實施方式】
[0031]下面結合附圖對本發(fā)明作進一步描述。以下實施例僅用于更加清楚地說明本發(fā)明的技術方案,而不能以此來限制本發(fā)明的保護范圍。
[0032]如圖1所示,為基于服務器-客戶端架構的系統(tǒng),包括服務器和客戶端,服務器內(nèi)置有實時數(shù)據(jù)庫和訂閱-發(fā)布模塊,客戶端內(nèi)置有應用程序和訂閱-發(fā)布模塊。
[0033]客戶端應用程序:獲得并使用實時數(shù)據(jù)庫中實時數(shù)據(jù)的實體,即具體的使用者。
[0034]如圖2所示,客戶端的訂閱-發(fā)布模塊:負責管理客戶端應用程序的訂閱請求,可注冊、注銷的客戶端應用程序的訂閱請求,在收到服務器的實時數(shù)據(jù)發(fā)布后,向注冊的應用程序發(fā)布其訂閱的實時數(shù)據(jù)。
[0035]客戶端的訂閱-發(fā)布模塊通過散列表和鏈表數(shù)據(jù)結構管理訂閱請求,其中,散列表以被訂閱數(shù)據(jù)的標簽名為鍵值,以訂閱該數(shù)據(jù)的客戶端應用程序句柄鏈表為值。
[0036]客戶端的訂閱-發(fā)布模塊注冊客戶端的訂閱請求過程為:
[0037]客戶端的訂閱-發(fā)布模塊接受到客戶端應用程序的訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則獲得該數(shù)據(jù)對應的應用程序句柄鏈表,如果鏈表中不存在該應用程序句柄,則將新的訂閱請求的應用程序句柄加入到鏈表末端;如果該數(shù)據(jù)未被訂閱,則新建應用程序句柄鏈表,并在鏈表中加入該訂閱應用程序句柄,在散列表中新建被訂閱數(shù)據(jù)的標簽名和該鏈表的映射關系,同時向服務器發(fā)送訂閱請求。
[0038]客戶端的訂閱-發(fā)布模塊注銷客戶端的訂閱請求過程為:
[0039]客戶端的訂閱-發(fā)布模塊收到客戶端應用程序的注銷訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則在散列表中獲得數(shù)據(jù)對應的應用程序句柄鏈表,遍歷鏈表,找到該應用程序句柄,并從鏈表中刪除該應用程序句柄;如果刪除后,鏈表為空,則說明客戶端中,已經(jīng)沒有應用程序訂閱該數(shù)據(jù),在散列表中刪除被注銷訂閱的數(shù)據(jù)標簽名和鏈表的映射關系,并刪除該鏈表,向服務器發(fā)出注銷訂閱請求。
[0040]實時數(shù)據(jù)庫:負責采集并存貯實時數(shù)據(jù),管理訪問事務。
[0041]如圖3所示,服務器的訂閱一發(fā)布模塊:負責管理客戶端的訂閱請求,可注冊、注銷的客戶端的訂閱請求,在實時數(shù)據(jù)滿足發(fā)布條件時,向注冊的客戶端發(fā)布其訂閱的實時數(shù)據(jù)。
[0042]服務器的訂閱-發(fā)布模塊通過散列表和鏈表數(shù)據(jù)結構管理訂閱請求,其中,散列表以被訂閱數(shù)據(jù)的標簽名為鍵值,以訂閱該數(shù)據(jù)的客戶端信息鏈表為值;客戶端信息包括客戶端的IP地址和主機名稱信息。
[0043]服務器的訂閱-發(fā)布模塊注冊客戶端的訂閱請求過程為:
[0044]服務器的訂閱-發(fā)布模塊在接收到客戶端的訂閱請求時,在散列表中查找該數(shù)據(jù)是否被訂閱,如是則獲得該數(shù)據(jù)所對應的客戶端信息鏈表;如果鏈表中不存在該客戶端信息,則將新的訂閱請求客戶端信息加入到鏈表末端;如果該數(shù)據(jù)沒有被訂閱,則需