背景

现在软件开发很多是多系统多模块,经常会遇到要将设备、人员、区域等资源同步到本系统数据库保存一份。资源同步常用的方案为全量同步和增量同步结合的方式,全量同步一般情况下为项目启动时和每天定时任务去同步所需资源,增量同步一般利用mq去接收资源的变更(增删改)通知然后修改到本地数据库。这里介绍下如何进行高效安全的全量同步。

全量同步

准备工作:
       假设要同步的表为region表,关键字段为(id, name, create_time, update_time),其他如(name, type, code)等根据业务而不同。另外创建一张region_temp表字段同region表。
调用其他系统的分页接口获取全量的region资源数据,并批量插入到region_temp表。
       region_temp表中已有最近同步的全量资源数据,但是,我们最终的目的是全量更新region表,针对以下场景分别阐述如何更新region表:

  1. 新增的数据
insert into region (id, name, code, create_time, update_time)
select t.id, t.name, t.code, t.create_time, t.update_time
from region_temp t
left join tb_region r on a.id = r.id
where r.id is null

该SQL做的是将新增的数据插入到region表中。该SQL将region_temp表与region表左联接,左联接的结果再通过region表的id为空条件过滤记录,region_temp的数据较新,因此region_temp中存在而region中不存在的id必然是需要新增到region中的记录。

  1. 修改的数据
update tb_region  set name = m.name, code=m.code, create_time=m.create_time, update_time=m.update_time from
(select t.id as id ,t.name as name , t.code as code, t.create_time as create_time, t.update_time as update_time
from region_temp t inner join tb_region r on a.id = r.id and r.update_time < t.update_time) m
where region.id = m.t_id

该SQL做的是将修改的数据修改到region表,其中,r.update_time < t.update_time的条件考虑到在做凌晨全量同步的过程中,可能发生了单条记录的更新操作(增量同步已经更新过了),因此,region表的update_time比region_temp表的update_time时间要早的记录才需要做批量的update操作,其余的以当前region表的记录为准。

  1. 删除的数据
update region set status = -1from
(select r.id as id
from region r left join region_temp t on t.id = r.id
where t.id is  null ) m
where region.id = m.id

该SQL做的是删除region表需要删除的记录。该SQL将region_temp表与region表右联接,右联接的结果再通过region_temp表的id为空条件过滤记录,region_temp中不存在而region中存在的id,便是需要删除的记录。若是同步期间新增的记录,那么,再引入a.create_time <= ${sync_time},即小于等于触发同步操作的时间。

被筛选出来的需要删除的记录可以通过spring的event模型发送内部消息,通知其它模块删除了region表某条记录。

伪代码:

//先清空临时表再批量插入同步过来的数据baseMapper.deleteTemplateAll();baseMapper.insertBatch(regionList);//执行更新baseMapper.insertNew();baseMapper.updateChange();baseMapper.updateDelete();

以上首先将数据保存到本地region_temp表,最后再在数据库层面进行region表的全量更新(不仅减少了和数据库传输的开销,而且更加高效)。若过程中出现获取全量资源失败,也不影响region表的正常crud,同时兼顾到删除的变更通知。另外,http全量获取资源的接口返回值中也不需要带上is_delete的软删除字段便可完成同步。

如何高效安全的将资源同步到本地数据库相关推荐

  1. 如何将RDS的数据同步到本地自建数据库

    长期以来有很多的用户咨询如何将RDS的数据同步到本地的数据库环境中,本篇文章以在阿里云的ECS服务器为例来说明如何将RDS的数据同步到本地数据库中.RDS对外提供服务是一个DNS地址+端口3306,这 ...

  2. 【Flutter】Flutter 自定义字体 ( 下载 TTF 字体 | pubspec.yaml 配置字体资源 | 同步资源 | 全局应用字体 | 局部应用字体 )

    文章目录 一.Flutter 自定义字体 1.ttf 字体文件 2.ttf 字体资源配置 3.获取字体 4.全局使用字体 5.局部使用字体 二.完整代码示例 三.相关资源 一.Flutter 自定义字 ...

  3. 深入理解JVM之代码执行机制与线程资源同步及交互机制

    Java规范定义标准结构如图3.1 Java代码的执行机制 Java源码编译机制 javac将Java源码编译为class文件的步骤如图3.2 1.分析和输入到符号表(Parse and Enter) ...

  4. unity3d 工程原理_Unity3D研究院之两个游戏工程资源同步问题(八十六)

    有的公司是不想让美术和策划有程序权限的,但是Unity在处理团队协作上不太理想,这就造成需要把美术工程的资源同步到程序工程里.目前我有两个方法,各有利弊. 1.由美术或者策划同步 Unity提供了.u ...

  5. 读 TiDB 论文有感 | 数据强一致性且资源隔离的 HTAP 数据库

    作者介绍: 陈现麟,伴鱼技术中台负责人,从 0 到 1 搭建伴鱼技术中台,对分布式架构.服务治理.稳定性建设.高并发高 QPS 系统和中台化的组织架构搭建有一定的经验,崇尚简单优雅的设计,关注云原生和 ...

  6. onenote怎么同步到电脑_详解onenote保存与同步④:本地笔记奇葩的丢失经历

    (此文介绍的是我遇到过的,极其奇葩的,丢失onenote本地笔记的惨痛经历.不论是否具有普遍性,对进一步理解缓存还是很有帮助的.大家若有其他丢失经历,可以交流.) 对于onenote本地笔记本而言,由 ...

  7. js清空本地存储_详解onenote保存与同步④:本地笔记奇葩的丢失经历

    (此文介绍的是我遇到过的,极其奇葩的,丢失onenote本地笔记的惨痛经历.不论是否具有普遍性,对进一步理解缓存还是很有帮助的.大家若有其他丢失经历,可以交流.) 对于onenote本地笔记本而言,由 ...

  8. 线上前端静态资源代理到本地的几种方式

    前言 我是一个小前端,前段时间开始支持集团监控平台业务. 当我拉下代码,开启本地服务,出现了一大堆请求错误. 原因是:本地的host是127.0.0.1,而接口调用的是线上数据. 接口的host和平台 ...

  9. 基于钉钉通讯录,同步构建本地LDAP服务

    上一篇<利用飞书通讯录同步搭建本地LDAP>方案发出后,引起不少企业 IT 人员共鸣.本次,宁盾针对使用了钉钉社交应用的企业推出基于钉钉通讯录(组织架构和用户信息)同步搭建本地 LDAP的 ...

最新文章

  1. FMS3系列学习网上教程
  2. Oracle OS Block Header
  3. 图解Dev C++ 创建Win32 项目模板
  4. IExcelExport
  5. java线程基础知识
  6. Spring Boot实战:数据库操作
  7. 前端学习(606):计算机基础
  8. STM32-GPIO篇
  9. css—left和margin-left的区别
  10. envi矢量图层外面有蓝色边框_蓝白渐层英短猫多少钱一只,美短银渐层大概多少钱...
  11. c++ 度分秒相互转化
  12. Win系统 - 如何清除冰点还原精灵 Deep Freeze 密码?
  13. 一个网页设计需求方眼中的网页设计
  14. win10一键重置win10,解决所有系统bug,不删除任何文件和应用
  15. 如何快速制作gif图片
  16. 程序员也懂浪漫,表白代码,你值得拥有 (html+css+js制作一个结婚邀请函)
  17. python正则匹配括号内任意字符,python 正则匹配 获取括号内字符
  18. 合力提升技术管网治网能力,共同为长三角的数字化发展贡献网信力量
  19. 关于shaderLab中 tags(标签)
  20. MATLAB App Designer入门实战(三)

热门文章

  1. tf keras SimpleRNN源码解析
  2. NLP 命名实体识别
  3. python 格式化字符串长度_python-格式化字符串
  4. matlab读取pdb文件,使用BioPython读取.pdb文件的整个目录
  5. list clear 2 python,python中怎么将列表的数据清空
  6. python格式化代码工具_python 代码格式化工具:YAPF
  7. 三十二、深入Python中的文件操作
  8. 二十一、Python爬取百度文库word文档内容
  9. leetcode 刷题140 141
  10. android跑步软件,手机跑步软件哪个好_安卓手机跑步记录软件_手机跑步app【最新】-太平洋电脑网...