springboot实现增量备份_增量同步-spring batch(6)动态参数绑定与增量同步

tags:springbatch

1.引言

上一篇《便捷的数据读写-spring batch(5)结合beetlSql进行数据读写》中使用Spring Batch及BeetlSql,对数据库读写组件进行数据库同步,实际上是全量同步。全量同步的问题在于每次需要读取整个表数据,如果表数据量大,则资源耗费大,而且不便于对已有数据的更新。因此,在数据同步过程中,更多的使用增量同步,即通过某些条件,区分新数据进行插入,对有变化的数据进行更新,对不存在的数据进行删除等(当然,一般都不会对数据进行物理删除,只做逻辑删除,因此也就变成了数据更新操作)。

增量更新更多情况需要依据上一次更新后的状态(如时间、自增ID,数据位置等),下一次更新以上一次更新的状态为基础,因此,需要把每一次更新后的状态以变量参数的方式保存下来,下一次更新则以此状态数据为动态参数来使用。Spring Batch支持任务运行时的动态参数,结合此特性,可以实现数据的增量同步。

2.开发环境

JDK: jdk1.8

Spring Boot: 2.1.4.RELEASE

Spring Batch:4.1.2.RELEASE

开发IDE: IDEA

构建工具Maven: 3.3.9

日志组件logback:1.2.3

lombok:1.18.6

3.增量同步简述

增量同步,是相对与全量同步,即每次同步,只需要同步源数据库变化的部分,这样提高了数据同步的效率。是当前数据同步的普遍方式。抽取变化的数据,又名CDC,即Change Data Capture变化数据捕获。在《Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案 》一书中,对CDC作了比较详细说明。此处简要做一下说明,当前实现增量同步的方式有4种,分别是基于源数据的CDC,基于触发器的CDC,基于快照的CDC,基于日志的CDC。

3.1 基于源数据的CDC

基于源数据的CDC要求源数据里有相关的属性列,利用这些属性列,可以判断出哪里是增量数据,最常见的属性列有:

时间戳

基于时间来标识数据,至少需要一个时间,最好两个,一个标识创建,一个标识更新时间,所以一般我们设计数据库时都会添加sys_create_time和sys_update_time作为默认字段,并且设计为默认当前时间和更新处理。

自增序列

使用数据库表的自增序列字段(一般是主键),来标识新插入的数据。不过现实中用得比较少。

此方法需要有一个临时表来保存上一次更新时间或,在实践中,一般是在独立的模式下创建此表,保存数据。下一次更新则比较上一次时间或序列。这是用得比较普遍的方式,本文中的增量同步也是使用此方法。

3.2 基于触发器的CDC

在数据库中编写触发器,当前数据库执行INSERT,UPDATE,DELETE等语句时,可以激活数据库中的触发器,然后触发器可以把这些变更的数据保存到中间临时表,然后再从临时表中获取这些数据,同步到目标数据库中。当然,这种方法是入侵性最强的,一般数据库都不允许向数据库里添加触发器(影响性能)。

3.3 基于快照的CDC

此方法就是一次抽取当前全部数据放到缓冲区,作为快照,下一次同步时从源数据读取数据,然后和快照做比较,找出变化的数据。简单来说是就做全表读取与比较,找出变化的数据。做全表扫描,问题就在于性能,所以一般不会使用这种方式。

3.4 基于日志的CDC

最高级和最没有入侵性的方法就

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值