浏览 2051 次
精华帖 (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分开,提供的是一个比较粗粒度的接口,如何在同步过程中的合适位置插入操作,而且无论在何种情况下(单表,主表-子表,附加操作)都在设计上一致(说白了就是为了减少编码量且看起来优雅)。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |