王芳



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