王芳
摘要:分布式數(shù)據(jù)庫(kù)被分布在不同的站點(diǎn)上,如何保障各站點(diǎn)數(shù)據(jù)庫(kù)的實(shí)時(shí)更新是數(shù)據(jù)庫(kù)管理員考慮的主要問(wèn)題。文章在飛機(jī)庫(kù)數(shù)據(jù)管理系統(tǒng)中提出了一種新的更新異地?cái)?shù)據(jù)庫(kù)的方案,通過(guò)主動(dòng)生成數(shù)據(jù)庫(kù)更新的詳細(xì)內(nèi)容,發(fā)送消息實(shí)時(shí)通信,由異地?cái)?shù)據(jù)庫(kù)管理員決定是否對(duì)異地?cái)?shù)據(jù)庫(kù)更新。
關(guān)鍵詞:數(shù)據(jù)庫(kù);消息;規(guī)則;SQL
1 分布式數(shù)據(jù)庫(kù)概述
分布式數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)主流研究方向。數(shù)據(jù)庫(kù)經(jīng)常被分布在不同的站點(diǎn)上,保障各站點(diǎn)數(shù)據(jù)的實(shí)時(shí)更新是主要問(wèn)題。對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行修改時(shí),一般有兩種方式:(1)用戶可以直接進(jìn)入到其他站點(diǎn)的數(shù)據(jù)庫(kù),對(duì)其修改;(2)通過(guò)傳送消息來(lái)實(shí)時(shí)修改數(shù)據(jù)庫(kù)。
本文采用介紹第二種方案,可以有效地維護(hù)數(shù)據(jù)庫(kù)的安全問(wèn)題。在這種方案中,如何在數(shù)據(jù)庫(kù)中提取有用字段,生成編碼并發(fā)送消息是課題研究的重點(diǎn)。
2 異地庫(kù)表的通信
利用通信技術(shù)實(shí)現(xiàn)對(duì)異地庫(kù)表的修改(見圖1),即每個(gè)站點(diǎn)的DBA發(fā)送消息給其他站點(diǎn),接受消息的站點(diǎn)根據(jù)得到的消息,對(duì)其接受的字段進(jìn)行分析和提取,利用數(shù)據(jù)庫(kù)的主動(dòng)機(jī)制實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自動(dòng)修改,提高了對(duì)數(shù)據(jù)庫(kù)操作的安全性和實(shí)時(shí)性[1]。
3 實(shí)時(shí)通信更新數(shù)據(jù)庫(kù)
3.1 消息規(guī)則的約定方法
實(shí)時(shí)通信時(shí),服務(wù)器和客戶機(jī)之間必須約定消息規(guī)則,以便于對(duì)消息進(jìn)行解析。數(shù)據(jù)庫(kù)更新時(shí),主動(dòng)生成的消息應(yīng)該包含以下內(nèi)容:修改的表名、修改的列名、修改列所對(duì)應(yīng)
的值。對(duì)規(guī)則格式的設(shè)置采用結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language,SQL)編寫。對(duì)消息規(guī)則格式定義為:
表名#對(duì)表的操作#所需的表字段信息。(“#”為信息段的分隔號(hào))。
3.1.1 刪除記錄
刪除表記錄時(shí),SQL語(yǔ)句為:Delete From表名Where 條件。
在一個(gè)表中,由于主鍵具有唯一性,所以可以提取主鍵的字段,作為刪除表記錄時(shí)需要滿足的條件。操作時(shí)采用的約定為:表名#刪除#主鍵。只需要對(duì)要?jiǎng)h除表記錄的主鍵的列名和值進(jìn)行提取,其余字段可以忽略。
3.1.2 修改記錄
對(duì)表中的已有數(shù)據(jù)進(jìn)行修改的SQL語(yǔ)句為:Update表名Set列名1=值1,列名2=值2,…Where條件。
同樣由于主鍵的唯一性,提取主鍵的字段,作為修改表記錄滿足的條件。對(duì)修改的表記錄的所有列名和值進(jìn)行提取(而不去管是否修改了該列),對(duì)所有列的值進(jìn)行重置。根據(jù)這種方法,在對(duì)表記錄修改時(shí),采用的約定為:表名#修改#主鍵#列名1=值1,列名2=值2,…
3.1.3 插入記錄
向表中插入一行數(shù)據(jù)的SQL語(yǔ)法如下:Insert Into表名[列名1,列名2,…]Values(值1,值2,…);
同樣把主鍵作為插入記錄滿足的條件,提取所有列名和所輸入的列值。插入表記錄時(shí)的約定為:表名#插入#列名1,列名2-#值1,值2,…客戶機(jī)接收到傳送的消息后,只需要寫入SQL語(yǔ)句中的固定語(yǔ)法部分,即可完成SQL語(yǔ)句,簡(jiǎn)化了客戶機(jī)對(duì)消息的解析過(guò)程[2]。
3.2 消息機(jī)制的實(shí)現(xiàn)
在實(shí)現(xiàn)通信時(shí)使用WinSock編寫程序。應(yīng)用程序調(diào)用Windows Sockets的應(yīng)用程序接口(Application Program Interface,API)實(shí)現(xiàn)相互之間的通信。[3]Windows Sockets又利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)際的通信工作。用戶修改了服務(wù)器的數(shù)據(jù)庫(kù)記錄后,可以通過(guò)發(fā)送消息到客戶機(jī),客戶機(jī)根據(jù)接收的消息對(duì)其數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的修改。如圖2所示,以修改飛機(jī)基本參數(shù)表為例。
(totalstring)+“#”
窗口消息如圖3所示。在服務(wù)器端運(yùn)行時(shí)候,對(duì)客戶端監(jiān)聽,如果成功,發(fā)出一個(gè)消息。發(fā)送消息的文本框內(nèi)給出了要發(fā)送到客戶機(jī)的消息。用戶可以在“客戶機(jī)IP地址”一欄輸入需要傳輸?shù)目蛻魴C(jī)的IP地址。監(jiān)聽按鈕程序如下:
如果要發(fā)送消息到客戶機(jī),則需要獲得信息:表名,所修改行的列名和對(duì)應(yīng)值。以對(duì)數(shù)據(jù)庫(kù)中表記錄的修改為例,其程序代碼如下:
string ls_colcount
ls_colcount = w_input.dw_l.Describe(“DataWindow.Column.Count”)
…………
//取得表名,得到修改的行的列名和值
for ncount=l to count -1
field_name=w_input.dw_l.Describe(“#”+string(ncount)+“Name”)
field_value=w_input.dw_l.getitemstring(w_input.dw_l.getrow(),ncount)
totalstring=totalstring+field-name+ “一”+field-value+“,”next
//獲得要發(fā)送的消息mle_2.text=xiao_xi+“#”+
“修改#”+key_name+“=”+key-value+“+”+trim
(totalstring)+“#”
窗口消息如圖3所示。在服務(wù)器端運(yùn)行時(shí)候,對(duì)客戶端監(jiān)聽,如果成功,發(fā)出一個(gè)消息。發(fā)送消息的文本框內(nèi)給出了要發(fā)送到客戶機(jī)的消息。用戶可以在“客戶機(jī)IP地址”一欄輸入需要傳輸?shù)目蛻魴C(jī)的IP地址。監(jiān)聽按鈕程序如下:
transport myaccept //定義全局變量
long ll_rc
myaccept=Create transport,
myaccept.driver=“winsocket”
myaccept.application:“appserver ”
ll_rc=myaccept.listen()
if ll_rc<>0 then
messageBox(“Unable to Start Server”,myaccept.
ErrText)
end if
客戶機(jī)根據(jù)得到的消息,對(duì)其解析,生成SQL語(yǔ)句,通過(guò)主動(dòng)機(jī)制,對(duì)客戶機(jī)數(shù)據(jù)庫(kù)中表的記錄進(jìn)行修改。
4 結(jié)語(yǔ)
本方案可以應(yīng)用在數(shù)據(jù)庫(kù)建立在多個(gè)站點(diǎn)且由不同數(shù)據(jù)庫(kù)管理員管理的情況下,并且可以針對(duì)不同的情況對(duì)具體實(shí)現(xiàn)方式進(jìn)行相應(yīng)的修改,具有可移植性。
[參考文獻(xiàn)]
[1]肖迎元.分布式實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)[M].北京:科學(xué)出版社,2009.
[2]郭寶利,康海濤,李冬冬.PowerBuilder 9.0實(shí)用解析[M].北京:電子工業(yè)出版社,2004.
[3]張英杰.PowerBuilder應(yīng)用工程軟件開發(fā)指南[M].西安:西安交通大學(xué)出版社,2005.
[4]鄧全良.Winsock網(wǎng)絡(luò)程序設(shè)計(jì)[M].北京:中國(guó)鐵道出版社,2002.