王芳



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