王芳
摘要:分布式数据库被分布在不同的站点上,如何保障各站点数据库的实时更新是数据库管理员考虑的主要问题。文章在飞机库数据管理系统中提出了一种新的更新异地数据库的方案,通过主动生成数据库更新的详细内容,发送消息实时通信,由异地数据库管理员决定是否对异地数据库更新。
关键词:数据库;消息;规则;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.