需求背景

有A&B两个数据库,以A为主,B要同步A上的数据,同步涉及数据的增删改查,且要每天同步一次。条件限制是,只能调用中台提供的接口操作数据库,不能写SQL。

解决思路

由于只能通过中台调用接口操作数据库,所以解决方法被限制在后端代码层面。至于每天执行一次,使用SpringBoot的定时任务注解@Scheduled就可以了。

1、遍历遍历再遍历

对于增加和修改,将A库中所有的数据通过接口拿到一个List里面,遍历这个List,每一趟检查B库中是否存在主键对应的数据,如果存在,则将数据更新,如果不存在,则直接插入。
对于A库中删除的数据,需要反向遍历,即将B库的数据拿出来,将数据进行遍历对比,如果发现B库中有的数据而A库中没有,则删除B库中的数据。

2、B中数据全删了,把A中的数据写上

如题,通过中台拿到A中的数据,然后把B库清空,再写A库的数据。
逻辑十分简单

3、内存中对比变化,只把变化落盘到数据库

大致思路是通过数据中台拿到A库的List和B库的List,比对这两个List的差别,只把差别写到数据库。
将A库中的数据拿到newList中,B库中的数据拿到oldList中,对newList进行遍历,每次遍历都寻找oldList中是否存在与newList对应的数据(通过主键作为对应标识);如果存在,则判断两个对象是否相等(要重写equals()和hashcode()方法),相等则直接从两个队列中剔除这个数据,不相等则调用接口进行数据更新,更新完了之后将更新过的数据从两个List中剔除;这样遍历完了之后,newList中剩下的没被剔除的数据就是B库需要新增的数据,oldList中剩下的没被剔除的数据就是B库需要删除的数据,需要修改的数据在遍历过程中已完成修改。
这个方案的伪码如下:

//A库中的数据同步到B库伪码//A库中的数据拿到newList中,B库中的数据拿到oldList
List<Data> newDataList;
List<Data> oldDataList;//从数据库中取数据......//开始遍历比对
for (Data newData : newDataList) {for (Data oldData : oldDataList) {//通过主键判断oldData与newData是否为同一条记录(对应)if (newData.getId().equals(oldData.getId())) {//主键对应上了,下面判断数据是否发生更改if (!newData.equals(oldData)) {//新旧数据不同,发生了更改,将更改落盘到数据库dataService.updateData(newData);} else {//新旧数据一致,说明没有发生更改,什么也不做}//新旧数据比对并操作后,将这两个数据从List中“移除”newData = null;oldData = null;}//两个数据主键没有对应上,说明不为同一条记录,继续遍历}//遍历完成之后,如果新数据在旧数据中有主键对应,则肯定会被置null//没被置null说明这条新数据是新增的,需要调用接口落盘if (newData != null) {dataService.insertData(newData);}
}//遍历完新数据后,oldDataList中剩下的没被置null的都是需要删除的
for (Data oldData : oldDataList) {if (oldData != null) {dataService.deleteDataById(oldData.getId());}
}//此时新旧数据库的内容就同步成一样的了

4、关于同步的建议

还是需要根据项目的需求来进行数据同步,比如有些场景对同步的速度没啥要求,再比如有些场景的数据量非常庞大,如果拿到内存中会oom。对于时间不敏感的同步,比如每天凌晨同步一次,则怎么稳定怎么来,逻辑怎么简单怎么来,哪怕要不停遍历,不要以为自己的逻辑想得太巧妙了,实际经常暗藏bug。

Java代码实现两个数据库之间的数据同步相关推荐

  1. 如何实现Oracle数据库之间的数据同步?

    我们都知道,在Oracle数据库的管理与开发工作中,总会存在着一些表数据和基础资料数据,这时需要有效的将这些数据库进行同步合并,有没有什么简单的方法可以实现Oracle数据库之间的数据同步呢?在此诚恺 ...

  2. java截取字符串两个符号之间的数据

    可以使用Java中的正则表达式来截取两个符号之间的数据.以下是一个示例代码,可以截取字符串中两个指定符号之间的数据: public static String getStringBetweenTwoC ...

  3. php mysql两个表合并_php操作mysql两个数据库中表的数据同步

    题记: 我们开发当中经常会遇到,数据同步.比如将teaching数据库中area表的数据同步到study数据库中zone表中. 备注:这两个数据库不同,数据表名字也不同,但数据表的结构相同.不同表结构 ...

  4. oracle两表同步java代码,利用DBLink+JOB实现两个Oracle数据库之间的数据同步

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第三步:建立JOB任务,定时同步数据在PL/SQL的command window输入以下语句: begin sys.dbms_job.submit(job ...

  5. 两个oracle数据库外网同步,利用DBLink+JOB实现两个Oracle数据库之间的数据同步

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第三步:建立JOB任务,定时同步数据在PL/SQL的command window输入以下语句: begin sys.dbms_job.submit(job ...

  6. win7两个mysql数据同步_两台服务器两个数据库怎么实现数据同步备份。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 SQL Server 2008 镜像 环境设置. 初始环境: 1.主机 Win7 + SQL Server 2008 R2 IP地址:192.168.56 ...

  7. java截取某两个字符之间的字串_Java截取特定两个标记之间的字符串实例

    Java截取特定两个标记之间的字符串实例 如有一串字符串: higklmnopq java代码如下: public class StringTest { public static void main ...

  8. 基于ssh的航空订票系统-飞机订票系统javaweb-机票订购课程设计java代码(源码+数据库文件+文档)

    基于ssh的航空订票系统-飞机订票系统javaweb-机票订购java代码(源码+数据库文件+文档) 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言: ...

  9. 比对两个数据库之间的库、表/视图以及列的差异

    本项目在我的github更新 https://github.com/nongxl/DBsDiff # DBsDiff #####比对两个数据库之间的库.表/视图以及列的差异.适用于开发库和正式库的比对 ...

最新文章

  1. linux 中输入一个c程序,从c源程序到Linux可执行代码的过程
  2. [YTU]_2489( C++结构体之统计最高最低分)
  3. 多个数字数组_1分钟彻底理解JavaScript的数组与函数
  4. C语言结构-演员请就位
  5. C语言学习之编程实现:输入长方形的两个边长a, b和一个整数k。k=1时,输出长方形的周长 l; k=2时 ,输出长方形的面积s;当k=3时 , 输出长方形的周长1和面积s
  6. ReactJS学习 相关网站
  7. jsx怎么往js里传参数_在vue中使用jsx语法的使用方法
  8. 高二学生学习计算机软件,精选高二信息技术教学计划三篇
  9. mysql 查询简单记忆_mysql 函数大全-简单的总结,便于记忆
  10. k近邻算法_k近邻算法
  11. ssm企业人事管理系统
  12. linux setcap指令,linux setcap/getcap
  13. 【python】实现canny算子与LoG算子
  14. ie9 ajax 二进制流,2.ajax兼容IE9 非常实用!!!
  15. 模拟赛DAY 2 T2不老梦
  16. 沐风微信营销水库模型二:建设专属秘密武器库!
  17. 任天堂超级玛丽(SuperMario)改编的超级企鹅(java)搞笑版,绝对给力
  18. python 警告:simplify chained comparison
  19. php计算四柱(生辰八字)
  20. ubuntu-20.04-desktop-amd64.iso下载/rufus-3.10.exe下载

热门文章

  1. 残差网络(Residual Network,ResNet)原理与结构概述
  2. 我热爱学习,更热爱学英语
  3. Mac环境下开发自有的可Remount的X86安卓镜像
  4. 互联网人疯起来,在哪里都可以办公!
  5. 联通恶意扣费我651元!增值业务沃音乐钻石会员未经同意开通,投诉全额退款心得分享
  6. 回车键登录的方法与控制台输出键盘码(keyCode)
  7. 【luogu P4590】游园会(DP套DP)
  8. 3.0.2-Reaper(track)多通道乐器输出设置
  9. 题:月光宝盒的密码(求严格上升子序列)
  10. Kali Nethunter MITMf的安装及使用(首发)