论坛首页 Java企业应用论坛

跨库数据同步,如何得出一种适合各种情况的设计

浏览 2052 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-11  
现在的需求是要同步新老系统中部分数据。比如人员,部门,发料记录,收料记录。。。等等。

由于无法根据用户的操作来辨别是该insert新记录到新系统,还是update或是delete,所以最上层提供的接口就是一个launch(List<String> keys)方法(是否合适),具体由在此方法内部判断该执行的操作,web层调用就像这样syncEngine.launch(keys),参数是为了指定需要同步记录的key值(老系统中数据的primary key,也可为null),
老系统的数据库是sqlserver,部分表记录了timestamp,所以一次同步的流程大概就是这样

1。获得新系统中对应表记录的最大timestamp值(如果有的话,若老系统中数据未更改,则该timestamp与老系统中对应记录一致)

2。获取老系统中的数据(若有timestamp可比,则加上条件timestamp>MAX(newApp's timpstamp),若有keys,则跟上 pk in (keys..),timestamp与keys是or关系,若没有keys也无timestamp,则获取全部记录

3。然后判断得出的数据在新系统中是否存在,将不存在的数据放入dataForInsert<Map>中,存在的放入dataForUpdate<Map>中,另外,若参数keys不为空,则还要判断该keys中的primary key在老系统中是否存在,若没有,说明老系统中删除了此记录,则在新系统中删除对应记录。

4。根据得出的dataForInsert,dataForUpdate,keysForDelete,分别执行数据操作,当然,若一个失败,则全体rollback.

现在的问题是,我想通过
OldAppDao(负责获取老系统数据)
NewAppDao(负责新系统数据的更新)
SyncEngine(service层)
三个类实现一个通用的同步引擎,如需要同步新的表,则只需要一个新的ibatis的配置文件,
但有的表的结构属于典型的(主表-子表)结构,而且有的表还需要在插入的时候进行价格移动平均调整(同步过程中的附加操作),
由于前面提到的,在最上层没有将insert,update,delete分开,提供的是一个比较粗粒度的接口,如何在同步过程中的合适位置插入操作,而且无论在何种情况下(单表,主表-子表,附加操作)都在设计上一致(说白了就是为了减少编码量且看起来优雅)。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics