陳亮雄,歐陽(yáng)顯良,楊靜學(xué),林奕霖,李晝陽(yáng)
(廣東省水利水電科學(xué)研究院,廣東省水動(dòng)力學(xué)應(yīng)用研究重點(diǎn)實(shí)驗(yàn)室,廣東 廣州 510635)
基于Socket的數(shù)據(jù)自動(dòng)復(fù)制技術(shù)設(shè)計(jì)與實(shí)現(xiàn)
陳亮雄,歐陽(yáng)顯良,楊靜學(xué),林奕霖,李晝陽(yáng)
(廣東省水利水電科學(xué)研究院,廣東省水動(dòng)力學(xué)應(yīng)用研究重點(diǎn)實(shí)驗(yàn)室,廣東 廣州 510635)
研究采用TCP/IP協(xié)議的Socket通信,開發(fā)了C/S應(yīng)用軟件,實(shí)現(xiàn)了自動(dòng)復(fù)制數(shù)據(jù)庫(kù)中的特定數(shù)據(jù)行記錄及其指定的相關(guān)附加文件,保證了數(shù)據(jù)共享時(shí),數(shù)據(jù)“一數(shù)一源”,以滿足水利信息化行業(yè)的特定需求。文章介紹了差異化數(shù)據(jù)復(fù)制技術(shù)的設(shè)計(jì)思路、Socket通信及復(fù)制流程、關(guān)鍵技術(shù)問題及系統(tǒng)實(shí)現(xiàn),為相關(guān)行業(yè)業(yè)務(wù)系統(tǒng)開發(fā)提供參考。
Socket;數(shù)據(jù)庫(kù);數(shù)據(jù)同步;自動(dòng)復(fù)制;水利信息化
省級(jí)業(yè)務(wù)應(yīng)用系統(tǒng)與流域管理局、地市一級(jí)的業(yè)務(wù)應(yīng)用系統(tǒng)之間,要實(shí)現(xiàn)部分表格、部分?jǐn)?shù)據(jù)、部分文件的自動(dòng)復(fù)制、更新,涉及到數(shù)據(jù)庫(kù)同步技術(shù)。數(shù)據(jù)庫(kù)同步技術(shù)是2個(gè)數(shù)據(jù)庫(kù)之間表數(shù)據(jù)復(fù)制的一種技術(shù),提供數(shù)據(jù)的數(shù)據(jù)庫(kù)稱為源數(shù)據(jù)庫(kù),接收數(shù)據(jù)的數(shù)據(jù)庫(kù)稱為目的數(shù)據(jù)庫(kù),源數(shù)據(jù)庫(kù)表中的數(shù)據(jù)發(fā)生增加、修改或刪除時(shí),目的數(shù)據(jù)庫(kù)表自動(dòng)作出同樣的增加、修改或刪除動(dòng)作,保證2個(gè)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)一致。數(shù)據(jù)庫(kù)同步技術(shù)有比較成熟的技術(shù)手段,很多數(shù)據(jù)庫(kù)管理平臺(tái)都提供了數(shù)據(jù)同步解決方案,但差異化的數(shù)據(jù)復(fù)制技術(shù)則鮮有成熟的應(yīng)用。所謂差異化的數(shù)據(jù)復(fù)制是指2個(gè)數(shù)據(jù)庫(kù)之間,表結(jié)構(gòu)不一定相同,數(shù)據(jù)內(nèi)容不完全相同,但符合特定條件的數(shù)據(jù)記錄(record)內(nèi)容要保持一致,其他記錄數(shù)據(jù)則不用復(fù)制,需要特殊的技術(shù)對(duì)2個(gè)數(shù)據(jù)庫(kù)之間的表數(shù)據(jù)記錄進(jìn)行分析判斷、定制查詢,對(duì)符號(hào)規(guī)定條件的數(shù)據(jù)記錄才進(jìn)行自動(dòng)復(fù)制,甚至同時(shí)復(fù)制數(shù)據(jù)庫(kù)外的數(shù)據(jù)記錄指定文件。
總的設(shè)想是制定數(shù)據(jù)復(fù)制的策略,在源服務(wù)器端根據(jù)策略查詢?cè)磾?shù)據(jù)庫(kù)的數(shù)據(jù),將查詢結(jié)果通過局域網(wǎng)或互聯(lián)網(wǎng)傳輸給目的數(shù)據(jù)庫(kù)服務(wù)器,在目的服務(wù)器端根據(jù)接收到的查詢結(jié)果,更新、插入或刪除目的數(shù)據(jù)庫(kù)。數(shù)據(jù)自動(dòng)復(fù)制要做成一種請(qǐng)求/服務(wù)模式,客戶端發(fā)出復(fù)制請(qǐng)求,服務(wù)端程序響應(yīng)請(qǐng)求,分析請(qǐng)求的合法性,再查詢?cè)磾?shù)據(jù)庫(kù),并將查詢結(jié)果傳輸給客戶端,由客戶端程序更新目的數(shù)據(jù)庫(kù),信息流程如圖1所示。
圖1 數(shù)據(jù)復(fù)制信息流程示意
客戶端與服務(wù)端的通信可采用Socket技術(shù)。Socket通常也稱作“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈的句柄,是使用標(biāo)準(zhǔn)Unix文件描述符和其他程序通訊的方式;Socket接口是TCP/IP網(wǎng)絡(luò)的API,定義了許多函數(shù)或例程,程序員可以用他們開發(fā)TCP/IP 網(wǎng)絡(luò)上的應(yīng)用程序[1]。使用Socket開發(fā),服務(wù)器使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(建議使用大于1024的端口),等待客戶連接請(qǐng)求;客戶連接后,會(huì)話產(chǎn)生;完成會(huì)話,關(guān)閉連接。客戶端使用ClientSocket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,連接成功,打開會(huì)話;會(huì)話完成,關(guān)閉Socket[2]。
Socket提供了客戶端與服務(wù)端之間的通信技術(shù),但要完成數(shù)據(jù)交互,還需要設(shè)計(jì)一套握手協(xié)議,使客戶端與服務(wù)端之間的對(duì)話和數(shù)據(jù)傳輸能順利進(jìn)行。
1) 連接服務(wù)器
客戶端ClientSocket設(shè)置Socket服務(wù)器的IP和Port,打開連接;服務(wù)器端ServerSocket監(jiān)聽到有ClientSocket連接,查看客戶端的IP,檢查是否合法連接;如果是,允許連接,通知客戶端連接成功;否則,直接斷開ClientSocket。
2) 測(cè)試連接
測(cè)試連接可發(fā)送一個(gè)征詢服務(wù)器時(shí)間的口令,讓服務(wù)器端返回當(dāng)前時(shí)間;如果客戶端接收到時(shí)間,表示連接正常,否則連接異常,流程如圖2所示。
圖2 測(cè)試連接信息流程
3) 數(shù)據(jù)復(fù)制
數(shù)據(jù)復(fù)制首先由客戶端發(fā)出復(fù)制申請(qǐng),申請(qǐng)中包含請(qǐng)求數(shù)據(jù)復(fù)制的條件;服務(wù)器端判斷申請(qǐng)是否合法,如果非法,返回syncNone給客戶端;如果合法,服務(wù)器從源數(shù)據(jù)庫(kù)中查詢滿足同步條件的記錄數(shù)量Count,發(fā)送口令通知客戶端做好接收準(zhǔn)備;然后逐條發(fā)送數(shù)據(jù)記錄給客戶端,客戶端根據(jù)接收到的數(shù)據(jù),生成并執(zhí)行SQL更新語(yǔ)句,更新目的數(shù)據(jù)庫(kù),流程見圖3。
圖3 數(shù)據(jù)復(fù)制信息流程
為了在數(shù)據(jù)發(fā)送和接收中保證完整性,可以在“逐條發(fā)送記錄”環(huán)節(jié)中增加圖4所示的發(fā)送/接收問答流程。
4) 傳輸口令和數(shù)據(jù)的封裝
為了保證口令和數(shù)據(jù)傳輸?shù)耐暾约胺奖闾幚?,Socket發(fā)送/接收的信息流采用字符串,需要對(duì)其進(jìn)行封裝。封裝格式如下:
指令分隔符:Const conSep=′;′#13;
請(qǐng)求應(yīng)答指令:Const conAsk=′_ask_′;
結(jié)束應(yīng)答指令:Const conAskEnd=′_askEnd_′;
每條傳輸指令都包含conAsk操作(例如Time?、sync等)和結(jié)尾標(biāo)識(shí)conAskEnd,各數(shù)據(jù)之間采用conSep進(jìn)行分隔,當(dāng)Socket接收了完整的指令后,根據(jù)conAsk操作進(jìn)行處理。例如請(qǐng)求執(zhí)行XXX操作(指令為conAsk=XXX),參數(shù)是YYY(指令為param=YYY),則完整的指令如下:
conSep+conAsk=XXX+conSep+param=YYY+conSep+…+conAskEnd
圖4 數(shù)據(jù)復(fù)制附加流程
1) 數(shù)據(jù)變化的識(shí)別方法
要復(fù)制的數(shù)據(jù)庫(kù)表結(jié)構(gòu)要求有一個(gè)時(shí)間日期(datetime)字段,例如modifytime字段,記錄數(shù)據(jù)最后修改時(shí)間;可以在執(zhí)行數(shù)據(jù)修改時(shí),把當(dāng)前時(shí)間同時(shí)保存在該字段中,示例如下:
UPDATE table_name SET modifytime=GETDATE(), … …
數(shù)據(jù)庫(kù)內(nèi)置的GETDATE()函數(shù)獲取當(dāng)前時(shí)間,精度達(dá)到毫秒級(jí)。也可采用數(shù)據(jù)庫(kù)觸發(fā)器的方式,當(dāng)數(shù)據(jù)發(fā)生修改時(shí),自動(dòng)修改該字段的內(nèi)容,示例如下:
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
比較源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)表記錄(record)的modifytime字段值,當(dāng)源數(shù)據(jù)庫(kù)表記錄的modifytime值大于目的數(shù)據(jù)庫(kù)表記錄的modifytime值,表示源數(shù)據(jù)已經(jīng)修改,需進(jìn)行復(fù)制。
2) 大數(shù)據(jù)的可靠傳輸
為保證大數(shù)據(jù)的可靠傳輸,數(shù)據(jù)流的發(fā)送和接收分別使用INDY成熟控件TIdTcpClient、TIdTCPServer。INDY的全名是Internet Direct,是一套開放源代碼的Internet控件集,完全基于SOCKET阻塞工作模式,支持大部分流行的Internet協(xié)議[3]。TIdTcpServer與TIdTcpClient是基于多線程的、阻塞式的2組通信組件。阻塞模式通信是指消息發(fā)送方的send調(diào)用需要接受方的recv調(diào)用的配合才可完成,這樣每1次數(shù)據(jù)的發(fā)送(send)和接收(recv),都可以附加數(shù)據(jù)校驗(yàn)碼(例如數(shù)據(jù)ASCII累加值)進(jìn)行驗(yàn)證,保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。阻塞模式需要等待任務(wù)完成才返回,因此,對(duì)每一個(gè)大數(shù)據(jù)傳輸,都要由獨(dú)立線程處理。為了簡(jiǎn)化大數(shù)據(jù)傳輸程序調(diào)用,本軟件對(duì)大數(shù)據(jù)的發(fā)送和接收進(jìn)行了封裝,示例如下:
TTcpFileServer=class //文件傳輸服務(wù),接收
procedure IdTCPServerExecute(AThread: TIdPeerThread);//監(jiān)聽并接收數(shù)據(jù)
private
tcpServer: TIdTcpServer;
tranSize: Integer;//接收數(shù)據(jù)大小
tranFileStream: TFileStream; //文件流接收
tranImgStream: TMemoryStream;//大數(shù)據(jù)流接收
public
…
end;
TTcpFileClient=class //文件傳輸服務(wù),發(fā)送
private
tcpClient: TIdTcpClient;
public
constructor Create(Owner: TComponent);
destructor Destroy; override;
function SendFile(fileName: String): Integer;//發(fā)送文件
function SendImgBuffer: Integer;//發(fā)送大數(shù)據(jù)
…
end;
3) 接收數(shù)據(jù)后更新數(shù)據(jù)庫(kù)
接收到sync指令,執(zhí)行數(shù)據(jù)更新操作,可能會(huì)引起主鍵沖突異常,更新失敗??梢圆捎孟雀鶕?jù)主鍵值keyValue查找目的數(shù)據(jù)庫(kù),判斷是否存在此keyValue的記錄;如果存在,采用update,否則采用insert。
IF EXISTS(存在keyValue記錄) UPDATE … ELSE INSERT …
4) 帶附件的數(shù)據(jù)復(fù)制
有些數(shù)據(jù)庫(kù)管理系統(tǒng)需要附件信息(例如監(jiān)控圖片),附件以獨(dú)立文件方式保存,數(shù)據(jù)庫(kù)只記錄文件名稱及存放目錄。數(shù)據(jù)復(fù)制中,不但要復(fù)制源數(shù)據(jù)庫(kù)中的記錄,還要把其指定的文件也復(fù)制到目的數(shù)據(jù)庫(kù)及指定的目錄中。
采用上述介紹的TcpFileServer和TcpFileClient類進(jìn)行文件傳輸。數(shù)據(jù)庫(kù)表記錄(record)復(fù)制的同時(shí),發(fā)送文件方創(chuàng)建TcpFileClient類的實(shí)例TcpClient,接收文件方創(chuàng)建TcpFileServer類的實(shí)例TcpServer,由獨(dú)立線程傳輸文件,把源數(shù)據(jù)庫(kù)中表記錄指定的文件復(fù)制到目的數(shù)據(jù)庫(kù)指定的目錄中,文件復(fù)制的流程見圖5。
圖5 文件復(fù)制流程
數(shù)據(jù)庫(kù)中存在大數(shù)據(jù)字段,例如text、image、blob(binary large objects)等類型的字段,傳輸和復(fù)制這些字段不能采用常規(guī)的字符串方式和insert、update SQL腳本,需要建立獨(dú)立的流媒體發(fā)送/接收線程傳輸數(shù)據(jù)流,接收后也要特殊處理數(shù)據(jù)流,更新到目的數(shù)據(jù)庫(kù)中。
數(shù)據(jù)傳輸可采用第4節(jié)介紹的文件傳輸方式,創(chuàng)建TcpClient和TcpServer實(shí)例,獨(dú)立線程發(fā)送和接收數(shù)據(jù)流tranStream,但文件名參數(shù)改為主鍵值keyValue或update SQL腳本。接收后利用ADOQuery控件,把數(shù)據(jù)流更新到數(shù)據(jù)庫(kù)中,代碼示意如下:
with TADOQuery.Create(nil) do
try
Connection:=adoConn;
SQL.Add(′Update ′+tableName+′ Set ′+fieldname+′=:blob′);
SQL.Add(′Where ′+keyField+′=′+keyValue);
(1)攔蝦。就是要攔好小龍蝦,防止小龍蝦逃跑,這是奪取湖泊養(yǎng)殖小龍蝦高產(chǎn)的先決條件。常見的攔蝦設(shè)備是用聚乙烯網(wǎng),然后在網(wǎng)上縫寬40.0cm的硬質(zhì)塑料薄膜。
if fieldType=′text’ then
Parameters[0].LoadFromStream(tranStream, ftMemo)
else
Parameters[0].LoadFromStream(tranStream, ftBlob);
Result:=ExecSQL>0;
finally
Free;
end;
6) 一數(shù)一源,復(fù)制記錄的選擇
為了保證“一數(shù)一源”,避免各方都可能修改同一數(shù)據(jù)記錄,引入數(shù)據(jù)權(quán)屬標(biāo)識(shí)ownerId的概念,在要復(fù)制的數(shù)據(jù)表結(jié)構(gòu)中增加ownerId和modifyTime字段。modifyTime是datetime類型字段,存儲(chǔ)數(shù)據(jù)記錄的最后修改時(shí)間,選擇復(fù)制條件之一就是modifyTime大于上次復(fù)制時(shí)間。ownerId定義記錄的數(shù)據(jù)由哪個(gè)機(jī)構(gòu)負(fù)責(zé)更新,各機(jī)構(gòu)只能修改權(quán)屬標(biāo)識(shí)為本機(jī)構(gòu)的數(shù)據(jù);選擇發(fā)送復(fù)制數(shù)據(jù)時(shí),只選擇滿足(ownerId=本機(jī)構(gòu)權(quán)屬標(biāo)識(shí)) 或 (ownerId=本機(jī)構(gòu)權(quán)屬標(biāo)識(shí)_客戶端權(quán)屬標(biāo)識(shí))的數(shù)據(jù)記錄。
系統(tǒng)采用C/S模式,分為客戶端程序和服務(wù)器端程序,可以運(yùn)行在局域網(wǎng)、互聯(lián)網(wǎng)等采用TCP/IP協(xié)議的網(wǎng)絡(luò)環(huán)境,編程開發(fā)工具為Delphi??蛻舳顺绦虿捎肅lientSocket控件通信[4],ADOConnection、ADOQuery、ADOCommand等控件訪問數(shù)據(jù)庫(kù),Timer計(jì)時(shí)器自動(dòng)觸發(fā)復(fù)制申請(qǐng);服務(wù)器端則采用ServerSocket控件監(jiān)聽客戶端的申請(qǐng),并對(duì)接收信息進(jìn)行響應(yīng)和相應(yīng)處理??蛻舳撕头?wù)器端均可向?qū)Ψ綇?fù)制數(shù)據(jù),為提高代碼的可重用性和通用性,軟件開發(fā)時(shí)用TSocketSendData類封裝數(shù)據(jù)的發(fā)送、接收及更新處理過程,用TTcpFileServer、TTcpFileClient類封裝文件、數(shù)據(jù)流的發(fā)送和接收。圖6、圖7分別是客戶端和服務(wù)器端程序的界面,實(shí)現(xiàn)了服務(wù)器連接設(shè)置、數(shù)據(jù)庫(kù)連接設(shè)置、運(yùn)行狀態(tài)設(shè)置、自動(dòng)創(chuàng)建配置表、復(fù)制計(jì)劃表管理、數(shù)據(jù)增量復(fù)制、數(shù)據(jù)完全復(fù)制等功能。
圖6 客戶端界面示意
圖7 服務(wù)器端界面示意
系統(tǒng)采用Socket技術(shù),C/S模式,分為客戶端程序和服務(wù)器端程序,可以運(yùn)行在局域網(wǎng)、互聯(lián)網(wǎng)等采用TCP/IP協(xié)議的網(wǎng)絡(luò)環(huán)境,實(shí)現(xiàn)本地或異地?cái)?shù)據(jù)庫(kù)之間的自動(dòng)復(fù)制功能??梢远ㄖ茝?fù)制的計(jì)劃、復(fù)制的條件,按業(yè)務(wù)需要靈活進(jìn)行數(shù)據(jù)自動(dòng)同步。有別于傳統(tǒng)的數(shù)據(jù)同步技術(shù),本系統(tǒng)可以在數(shù)據(jù)行記錄(record)級(jí)別控制數(shù)據(jù)的同步,即只同步復(fù)制特定的行數(shù)據(jù),且可以復(fù)制數(shù)據(jù)庫(kù)表記錄指定的附件,保證在數(shù)據(jù)共享的同時(shí),保持?jǐn)?shù)據(jù)“一數(shù)一源”和數(shù)據(jù)完整性,滿足水利信息化行業(yè)的特定需求。
[1] 文顯瓊,張繼榮.基于Socket的網(wǎng)絡(luò)編程及其實(shí)現(xiàn)[J].軟件導(dǎo)刊,2012(2):97-98.
[2] 王曉鵬.TCP/IP下的Socket及Winsock通信機(jī)制[J].航空計(jì)算技術(shù),2004(2):126-128.
[3] 鐘志武.基于Delphi INDY控件的GPRS無線視頻通信程序在山洪災(zāi)害預(yù)警系統(tǒng)中的應(yīng)用[J].湖南水利水電,2012(3):99-101.
[4] 胡開明.基于Delphi的機(jī)房一體化教學(xué)監(jiān)控系統(tǒng)設(shè)計(jì)[J].齊齊哈爾大學(xué)學(xué)報(bào)(自然科學(xué)版),2012(3):40-44.
(本文責(zé)任編輯 王瑞蘭)
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 基金項(xiàng)目:北斗衛(wèi)星系統(tǒng)在水利防災(zāi)減災(zāi)中的應(yīng)用(編號(hào):2013B030200003)。
陳亮雄(1967),男,碩士,教授級(jí)高級(jí)工程師,主要從事水利信息化等研究工作。
TP311.132
:A
:1008-0112(2016)012-0047-05