基于Socket的数据自动复制技术设计与实现
2016-02-11陈亮雄欧阳显良杨静学林奕霖李昼阳
陈亮雄,欧阳显良,杨静学,林奕霖,李昼阳
(广东省水利水电科学研究院,广东省水动力学应用研究重点实验室,广东 广州 510635)
基于Socket的数据自动复制技术设计与实现
陈亮雄,欧阳显良,杨静学,林奕霖,李昼阳
(广东省水利水电科学研究院,广东省水动力学应用研究重点实验室,广东 广州 510635)
研究采用TCP/IP协议的Socket通信,开发了C/S应用软件,实现了自动复制数据库中的特定数据行记录及其指定的相关附加文件,保证了数据共享时,数据“一数一源”,以满足水利信息化行业的特定需求。文章介绍了差异化数据复制技术的设计思路、Socket通信及复制流程、关键技术问题及系统实现,为相关行业业务系统开发提供参考。
Socket;数据库;数据同步;自动复制;水利信息化
省级业务应用系统与流域管理局、地市一级的业务应用系统之间,要实现部分表格、部分数据、部分文件的自动复制、更新,涉及到数据库同步技术。数据库同步技术是2个数据库之间表数据复制的一种技术,提供数据的数据库称为源数据库,接收数据的数据库称为目的数据库,源数据库表中的数据发生增加、修改或删除时,目的数据库表自动作出同样的增加、修改或删除动作,保证2个数据库之间的数据一致。数据库同步技术有比较成熟的技术手段,很多数据库管理平台都提供了数据同步解决方案,但差异化的数据复制技术则鲜有成熟的应用。所谓差异化的数据复制是指2个数据库之间,表结构不一定相同,数据内容不完全相同,但符合特定条件的数据记录(record)内容要保持一致,其他记录数据则不用复制,需要特殊的技术对2个数据库之间的表数据记录进行分析判断、定制查询,对符号规定条件的数据记录才进行自动复制,甚至同时复制数据库外的数据记录指定文件。
1 设计思路
总的设想是制定数据复制的策略,在源服务器端根据策略查询源数据库的数据,将查询结果通过局域网或互联网传输给目的数据库服务器,在目的服务器端根据接收到的查询结果,更新、插入或删除目的数据库。数据自动复制要做成一种请求/服务模式,客户端发出复制请求,服务端程序响应请求,分析请求的合法性,再查询源数据库,并将查询结果传输给客户端,由客户端程序更新目的数据库,信息流程如图1所示。
图1 数据复制信息流程示意
2 Socket通信及复制流程
客户端与服务端的通信可采用Socket技术。Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,是使用标准Unix文件描述符和其他程序通讯的方式;Socket接口是TCP/IP网络的API,定义了许多函数或例程,程序员可以用他们开发TCP/IP 网络上的应用程序[1]。使用Socket开发,服务器使用ServerSocket监听指定的端口,端口可以随意指定(建议使用大于1024的端口),等待客户连接请求;客户连接后,会话产生;完成会话,关闭连接。客户端使用ClientSocket对网络上某一个服务器的某一个端口发出连接请求,连接成功,打开会话;会话完成,关闭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 数据复制附加流程
3 关键技术问题
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指令,执行数据更新操作,可能会引起主键冲突异常,更新失败。可以采用先根据主键值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=本机构权属标识_客户端权属标识)的数据记录。
4 系统实现
系统采用C/S模式,分为客户端程序和服务器端程序,可以运行在局域网、互联网等采用TCP/IP协议的网络环境,编程开发工具为Delphi。客户端程序采用ClientSocket控件通信[4],ADOConnection、ADOQuery、ADOCommand等控件访问数据库,Timer计时器自动触发复制申请;服务器端则采用ServerSocket控件监听客户端的申请,并对接收信息进行响应和相应处理。客户端和服务器端均可向对方复制数据,为提高代码的可重用性和通用性,软件开发时用TSocketSendData类封装数据的发送、接收及更新处理过程,用TTcpFileServer、TTcpFileClient类封装文件、数据流的发送和接收。图6、图7分别是客户端和服务器端程序的界面,实现了服务器连接设置、数据库连接设置、运行状态设置、自动创建配置表、复制计划表管理、数据增量复制、数据完全复制等功能。
图6 客户端界面示意
图7 服务器端界面示意
5 结语
系统采用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