陳亮雄,歐陽顯良,楊靜學,林奕霖,李晝陽
(廣東省水利水電科學研究院,廣東省水動力學應用研究重點實驗室,廣東 廣州 510635)
基于Socket的數據自動復制技術設計與實現
陳亮雄,歐陽顯良,楊靜學,林奕霖,李晝陽
(廣東省水利水電科學研究院,廣東省水動力學應用研究重點實驗室,廣東 廣州 510635)
研究采用TCP/IP協議的Socket通信,開發了C/S應用軟件,實現了自動復制數據庫中的特定數據行記錄及其指定的相關附加文件,保證了數據共享時,數據“一數一源”,以滿足水利信息化行業的特定需求。文章介紹了差異化數據復制技術的設計思路、Socket通信及復制流程、關鍵技術問題及系統實現,為相關行業業務系統開發提供參考。
Socket;數據庫;數據同步;自動復制;水利信息化
省級業務應用系統與流域管理局、地市一級的業務應用系統之間,要實現部分表格、部分數據、部分文件的自動復制、更新,涉及到數據庫同步技術。數據庫同步技術是2個數據庫之間表數據復制的一種技術,提供數據的數據庫稱為源數據庫,接收數據的數據庫稱為目的數據庫,源數據庫表中的數據發生增加、修改或刪除時,目的數據庫表自動作出同樣的增加、修改或刪除動作,保證2個數據庫之間的數據一致。數據庫同步技術有比較成熟的技術手段,很多數據庫管理平臺都提供了數據同步解決方案,但差異化的數據復制技術則鮮有成熟的應用。所謂差異化的數據復制是指2個數據庫之間,表結構不一定相同,數據內容不完全相同,但符合特定條件的數據記錄(record)內容要保持一致,其他記錄數據則不用復制,需要特殊的技術對2個數據庫之間的表數據記錄進行分析判斷、定制查詢,對符號規定條件的數據記錄才進行自動復制,甚至同時復制數據庫外的數據記錄指定文件。
總的設想是制定數據復制的策略,在源服務器端根據策略查詢源數據庫的數據,將查詢結果通過局域網或互聯網傳輸給目的數據庫服務器,在目的服務器端根據接收到的查詢結果,更新、插入或刪除目的數據庫。數據自動復制要做成一種請求/服務模式,客戶端發出復制請求,服務端程序響應請求,分析請求的合法性,再查詢源數據庫,并將查詢結果傳輸給客戶端,由客戶端程序更新目的數據庫,信息流程如圖1所示。

圖1 數據復制信息流程示意
客戶端與服務端的通信可采用Socket技術。Socket通常也稱作“套接字”,用于描述IP地址和端口,是一個通信鏈的句柄,是使用標準Unix文件描述符和其他程序通訊的方式;Socket接口是TCP/IP網絡的API,定義了許多函數或例程,程序員可以用他們開發TCP/IP 網絡上的應用程序[1]。使用Socket開發,服務器使用ServerSocket監聽指定的端口,端口可以隨意指定(建議使用大于1024的端口),等待客戶連接請求;客戶連接后,會話產生;完成會話,關閉連接??蛻舳耸褂肅lientSocket對網絡上某一個服務器的某一個端口發出連接請求,連接成功,打開會話;會話完成,關閉Socket[2]。
Socket提供了客戶端與服務端之間的通信技術,但要完成數據交互,還需要設計一套握手協議,使客戶端與服務端之間的對話和數據傳輸能順利進行。
1) 連接服務器
客戶端ClientSocket設置Socket服務器的IP和Port,打開連接;服務器端ServerSocket監聽到有ClientSocket連接,查看客戶端的IP,檢查是否合法連接;如果是,允許連接,通知客戶端連接成功;否則,直接斷開ClientSocket。
2) 測試連接
測試連接可發送一個征詢服務器時間的口令,讓服務器端返回當前時間;如果客戶端接收到時間,表示連接正常,否則連接異常,流程如圖2所示。

圖2 測試連接信息流程
3) 數據復制
數據復制首先由客戶端發出復制申請,申請中包含請求數據復制的條件;服務器端判斷申請是否合法,如果非法,返回syncNone給客戶端;如果合法,服務器從源數據庫中查詢滿足同步條件的記錄數量Count,發送口令通知客戶端做好接收準備;然后逐條發送數據記錄給客戶端,客戶端根據接收到的數據,生成并執行SQL更新語句,更新目的數據庫,流程見圖3。

圖3 數據復制信息流程
為了在數據發送和接收中保證完整性,可以在“逐條發送記錄”環節中增加圖4所示的發送/接收問答流程。
4) 傳輸口令和數據的封裝
為了保證口令和數據傳輸的完整性及方便處理,Socket發送/接收的信息流采用字符串,需要對其進行封裝。封裝格式如下:
指令分隔符:Const conSep=′;′#13;
請求應答指令:Const conAsk=′_ask_′;
結束應答指令:Const conAskEnd=′_askEnd_′;
每條傳輸指令都包含conAsk操作(例如Time?、sync等)和結尾標識conAskEnd,各數據之間采用conSep進行分隔,當Socket接收了完整的指令后,根據conAsk操作進行處理。例如請求執行XXX操作(指令為conAsk=XXX),參數是YYY(指令為param=YYY),則完整的指令如下:
conSep+conAsk=XXX+conSep+param=YYY+conSep+…+conAskEnd

圖4 數據復制附加流程
1) 數據變化的識別方法
要復制的數據庫表結構要求有一個時間日期(datetime)字段,例如modifytime字段,記錄數據最后修改時間;可以在執行數據修改時,把當前時間同時保存在該字段中,示例如下:
UPDATE table_name SET modifytime=GETDATE(), … …
數據庫內置的GETDATE()函數獲取當前時間,精度達到毫秒級。也可采用數據庫觸發器的方式,當數據發生修改時,自動修改該字段的內容,示例如下:
CREATE TRIGGER trigger_name ON table_name
FOR INSERT,UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE table_name SET modifytime=GETDATE()
FROM table_name a,inserted b
WHERE a.keyField=b.keyField
SET NOCOUNT OFF;
END
比較源數據庫和目的數據庫表記錄(record)的modifytime字段值,當源數據庫表記錄的modifytime值大于目的數據庫表記錄的modifytime值,表示源數據已經修改,需進行復制。
2) 大數據的可靠傳輸
為保證大數據的可靠傳輸,數據流的發送和接收分別使用INDY成熟控件TIdTcpClient、TIdTCPServer。INDY的全名是Internet Direct,是一套開放源代碼的Internet控件集,完全基于SOCKET阻塞工作模式,支持大部分流行的Internet協議[3]。TIdTcpServer與TIdTcpClient是基于多線程的、阻塞式的2組通信組件。阻塞模式通信是指消息發送方的send調用需要接受方的recv調用的配合才可完成,這樣每1次數據的發送(send)和接收(recv),都可以附加數據校驗碼(例如數據ASCII累加值)進行驗證,保證數據傳輸的準確性。阻塞模式需要等待任務完成才返回,因此,對每一個大數據傳輸,都要由獨立線程處理。為了簡化大數據傳輸程序調用,本軟件對大數據的發送和接收進行了封裝,示例如下:
TTcpFileServer=class //文件傳輸服務,接收
procedure IdTCPServerExecute(AThread: TIdPeerThread);//監聽并接收數據
private
tcpServer: TIdTcpServer;
tranSize: Integer;//接收數據大小
tranFileStream: TFileStream; //文件流接收
tranImgStream: TMemoryStream;//大數據流接收
public
…
end;
TTcpFileClient=class //文件傳輸服務,發送
private
tcpClient: TIdTcpClient;
public
constructor Create(Owner: TComponent);
destructor Destroy; override;
function SendFile(fileName: String): Integer;//發送文件
function SendImgBuffer: Integer;//發送大數據
…
end;
3) 接收數據后更新數據庫
接收到sync指令,執行數據更新操作,可能會引起主鍵沖突異常,更新失敗??梢圆捎孟雀鶕麈I值keyValue查找目的數據庫,判斷是否存在此keyValue的記錄;如果存在,采用update,否則采用insert。
IF EXISTS(存在keyValue記錄) UPDATE … ELSE INSERT …
4) 帶附件的數據復制
有些數據庫管理系統需要附件信息(例如監控圖片),附件以獨立文件方式保存,數據庫只記錄文件名稱及存放目錄。數據復制中,不但要復制源數據庫中的記錄,還要把其指定的文件也復制到目的數據庫及指定的目錄中。
采用上述介紹的TcpFileServer和TcpFileClient類進行文件傳輸。數據庫表記錄(record)復制的同時,發送文件方創建TcpFileClient類的實例TcpClient,接收文件方創建TcpFileServer類的實例TcpServer,由獨立線程傳輸文件,把源數據庫中表記錄指定的文件復制到目的數據庫指定的目錄中,文件復制的流程見圖5。

圖5 文件復制流程
數據庫中存在大數據字段,例如text、image、blob(binary large objects)等類型的字段,傳輸和復制這些字段不能采用常規的字符串方式和insert、update SQL腳本,需要建立獨立的流媒體發送/接收線程傳輸數據流,接收后也要特殊處理數據流,更新到目的數據庫中。
數據傳輸可采用第4節介紹的文件傳輸方式,創建TcpClient和TcpServer實例,獨立線程發送和接收數據流tranStream,但文件名參數改為主鍵值keyValue或update SQL腳本。接收后利用ADOQuery控件,把數據流更新到數據庫中,代碼示意如下:
with TADOQuery.Create(nil) do
try
Connection:=adoConn;
SQL.Add(′Update ′+tableName+′ Set ′+fieldname+′=:blob′);
SQL.Add(′Where ′+keyField+′=′+keyValue);
(1)攔蝦。就是要攔好小龍蝦,防止小龍蝦逃跑,這是奪取湖泊養殖小龍蝦高產的先決條件。常見的攔蝦設備是用聚乙烯網,然后在網上縫寬40.0cm的硬質塑料薄膜。
if fieldType=′text’ then
Parameters[0].LoadFromStream(tranStream, ftMemo)
else
Parameters[0].LoadFromStream(tranStream, ftBlob);
Result:=ExecSQL>0;
finally
Free;
end;
6) 一數一源,復制記錄的選擇
為了保證“一數一源”,避免各方都可能修改同一數據記錄,引入數據權屬標識ownerId的概念,在要復制的數據表結構中增加ownerId和modifyTime字段。modifyTime是datetime類型字段,存儲數據記錄的最后修改時間,選擇復制條件之一就是modifyTime大于上次復制時間。ownerId定義記錄的數據由哪個機構負責更新,各機構只能修改權屬標識為本機構的數據;選擇發送復制數據時,只選擇滿足(ownerId=本機構權屬標識) 或 (ownerId=本機構權屬標識_客戶端權屬標識)的數據記錄。
系統采用C/S模式,分為客戶端程序和服務器端程序,可以運行在局域網、互聯網等采用TCP/IP協議的網絡環境,編程開發工具為Delphi??蛻舳顺绦虿捎肅lientSocket控件通信[4],ADOConnection、ADOQuery、ADOCommand等控件訪問數據庫,Timer計時器自動觸發復制申請;服務器端則采用ServerSocket控件監聽客戶端的申請,并對接收信息進行響應和相應處理。客戶端和服務器端均可向對方復制數據,為提高代碼的可重用性和通用性,軟件開發時用TSocketSendData類封裝數據的發送、接收及更新處理過程,用TTcpFileServer、TTcpFileClient類封裝文件、數據流的發送和接收。圖6、圖7分別是客戶端和服務器端程序的界面,實現了服務器連接設置、數據庫連接設置、運行狀態設置、自動創建配置表、復制計劃表管理、數據增量復制、數據完全復制等功能。

圖6 客戶端界面示意

圖7 服務器端界面示意
系統采用Socket技術,C/S模式,分為客戶端程序和服務器端程序,可以運行在局域網、互聯網等采用TCP/IP協議的網絡環境,實現本地或異地數據庫之間的自動復制功能。可以定制復制的計劃、復制的條件,按業務需要靈活進行數據自動同步。有別于傳統的數據同步技術,本系統可以在數據行記錄(record)級別控制數據的同步,即只同步復制特定的行數據,且可以復制數據庫表記錄指定的附件,保證在數據共享的同時,保持數據“一數一源”和數據完整性,滿足水利信息化行業的特定需求。
[1] 文顯瓊,張繼榮.基于Socket的網絡編程及其實現[J].軟件導刊,2012(2):97-98.
[2] 王曉鵬.TCP/IP下的Socket及Winsock通信機制[J].航空計算技術,2004(2):126-128.
[3] 鐘志武.基于Delphi INDY控件的GPRS無線視頻通信程序在山洪災害預警系統中的應用[J].湖南水利水電,2012(3):99-101.
[4] 胡開明.基于Delphi的機房一體化教學監控系統設計[J].齊齊哈爾大學學報(自然科學版),2012(3):40-44.
(本文責任編輯 王瑞蘭)
Design and Implementation of Automatic Data Replication Technology Based on Socket
CHEN Liangxiong, OUYANG Xianliang, YANG Jingxue, LIN Yilin, LI Zhouyang
(Guangdong Research Institute of Water Resources & Hydropower,Guangdong Provincial Key Laboratory of Hydrodynamics,Guangzhou 510635,China)
TCP/IP protocol is applied to Socket communications to develop client/server application software. It can automatically copy a particular row of data records in the database and specify additional files, to ensure data sharing and data “source” in order to meet the specific needs of water conservancy informatization. And also the design ideas of differential data replication technology, Socket communication and replication process, key technology issues and system implementation are introduced in this paper, which provides reference for the relevant system development.
Socket; database; data synchronization; automatic duplication; water conservancy informatization
2016-11-24;
2016-12-10 基金項目:北斗衛星系統在水利防災減災中的應用(編號:2013B030200003)。
陳亮雄(1967),男,碩士,教授級高級工程師,主要從事水利信息化等研究工作。
TP311.132
:A
:1008-0112(2016)012-0047-05