如何进行异构数据库同步(下篇)
1、详细设计
1.1 SQL语句通用解析程序
首先需要一个通用的“SQL语句通用解析程序”,因为异构数据库的大部分表都与另外的表有一一对应的关系,该解析程序用于对这些一一对应的表进行处理。
表与表之间的对应关系基于上篇提到的整理的Excel文档,“SQL语句通用解析程序”如何读取对应关系对收到的INSERT、UPDATE和DELETE语句进行处理呢?笔者采用的是将对应关系写入XML文档中,当然也可以采用另外的方式。
参考XML格式如下(Oracle 新系统 -> SQL Server旧系统):
<table name="freephone" partyName="PLAT_FreePhone" fieldCount="8">
<field name="Phone" partyName="Phone" primary="true" />
<field name="ProductID" type="varchar" partyName="ProductID" partyType="int" />
<field name="AreaId" partyName="" />
<field name="Effect" partyName="" />
<field name="EffectLess" partyName="" />
<field name="Addtime" type="varchar" partyName="AddTime" partyType="datetime" partyValue/>
<field name="Operator" partyName="Operator" />
<field name="Remark" partyName="Remark" />
</table>
当一方对freephone表操作的INSERT语句:
insert into freephone (Phone, ProductID, AreaId, Effect, EffectLess, Addtime, Operator, Remark)values(‘13122223333’,‘003’,25,‘20110724000000’,‘20111024235959’,‘20110702409000000’, ‘amigo’, ‘amigo add!’)
根据上面XML配置和通用解析程序的处理,对应对方的新的SQL语句为:
INSERT INTO PLAT_FreePhone(Phone, ProductID, AddTime, Operator, Remark) values(‘13122223333’, 3, GETDATE(), ‘amigo’, ‘amigo add!’)
再看一条UPDATE语句:
update freephone set ProductID=’004’, AreaId=26 where Phone=’13122223333’
转换为对方的语句为:
update PLAT_FreePhone set ProductID=4 where Phone=’13122223333’
另外除了如上所演示的简单的类型不同、字段名称不同,有些字段在对方没有外,有时候有些字段还需要一定的转换,例如在一方存储的limited字符串是二进制方式,例如111111,而对方存储的是二进制对应的十进制的值,再例如,一方存储的是6位的时间(时分秒),而对方存储的只是4位的时间(时分),那么可做一次自定义的substr操作。
看另一个参考的XML实例:
<table name="phonelimited" partyName="PLAT_PhoneLimited" fieldCount="6">
<field name="Phonenumber" partyName="Phone" primary="true" />
<field name="AreaId" type="int" partyName="AreaID" partyType="int" />
<field name="Limited" type="varchar" partyName="Limited" partyType="int" function="binToDec" />
<field name="AddTime" type="varchar" partyName="AddTime" partyType="datetime" />
<field name="Operator" partyName="Operator" />
<field name="Remark" partyName="Remark" />
</table>
其中:function="binToDec"表示需要进行一次二进制到十进制的转换,一方的如下语句:
insert into phonelimited(Phonenumber, AreaId, Limited) values(‘13122223333’, 25, ‘10110’)
转换成对方的INSERT语句如下:
insert into PLAT_PhoneLimited(Phone, AreaID, Limited) values(‘13122223333’, 25, 22)
需要做取字串操作的参考定义如下:
<field name="StartTime" length="6" partyName="OpenTime" partyLength="4" function="substr" />
另外,还有一些字段本端没有,对端具有并且有点还是必填字段,并且对端的这些字段需要填写固定的值,因此在INSERT、UPDATE和DELETE语句都需要进行特别的操作,参考XML定义如下:
……
<insert fieldCount="2">
<field name="Node" value="0" />
<field name="Key" value="" />
</insert>
<update condition="and Node=0 and key=''" />
<delete condition="and Node=0 and key=''" />
……
1.2 SQL语句接收器程序
异构数据库的SQL语句传过来时,需要一个SQL语句接收器程序,该接收器解析该语句操作的表名(例如phonelimited)、执行的操作名(INSERT、UPDATE还是DELETE),根据这些信息读取配置文件信息,决定是调用“1.1 SQL语句通用解析程序”进行处理,如果不是存在一对一对应关系的表,扔给配置的指定业务进行特别处理。
该程序的主要功能如下:
(1)接收SQL语句:只接收需要同步的表的INSERT、UPDATE和DELETE语句,SELECT语句直接丢弃;
(2)分发SQL语句:将语句分发给不同程序进行处理,解析接收到的SQL语句的表名和操作名称,决定分发给通用解析进行处理还是特定解析程序进行处理。
&nbs