# datasync
**Repository Path**: dhd_index/datasync
## Basic Information
- **Project Name**: datasync
- **Description**: 一款Java开发的数据同步软件,支持mysql,sqlserver,oracle之间的数据同步,理论上支持任何jdbc可访问的关系数据库。本软件是由实际项目驱动而开发,之后抽取成为单独项目并开源。
支持定时同步与固定频率同步,全量同步和增量同步,以及分页查询同步。
主要使用技术:spring boot,spring jdbc,cron定时表达式
数据同步策略:全量同步,增量同步
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 30
- **Created**: 2016-09-15
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# datasync
一款Java开发的数据同步软件,支持mysql,sqlserver,oracle之间的数据同步,理论上支持任何jdbc可访问的关系数据库。本软件是由实际项目驱动而开发,之后抽取成为单独项目并开源。
支持定时同步与固定频率同步,全量同步和增量同步,以及分页查询同步。
**主要使用技术**:spring boot,spring jdbc,cron定时表达式
**数据同步策略**:全量同步,增量同步
### 全量同步
每次同步时,先清空目标表所有记录,再从源表查出所有记录并插入到目标表。
### 增量同步
每次同步时,获取出上次同步的分界点,再从源表的分界点开始增量同步到目标表。
### 使用方法
修改spring-config.xml配置以下前三步
+ **配置数据源**
```xml
```
+ **配置同步Job**
```xml
```
> strategy:all 表示全量同步。
> originds:源数据源
> targetds:目标数据源
> selectSql:查询源数据表的sql语句
> insertSql:插入到目标表的sql,切记字段要与selectSql中的一一对应
> deleteSql:执行全量同步时,需要先清空目标表记录,这里配置清空目标表的sql
```xml
```
> strategy:delta 表示增量同步。
> originds:源数据源
> targetds:目标数据源
> pageSize:分页查询大小
> startTime:增量同步要求源表必须有一个时间字段,用于计算分界点。此参数用于配置第一次同步时,从哪个时间点开始同步数据,之后系统会记录最新的时间点,并保存到syncinf.properties文件中。系统优先从syncinf.properties文件中取,若取不到再使用本参数。因此若配置了此参数,系统只在第一次同步时使用(因为此时syncinf.properties文件中是空的),之后会保存到文件中,优先使用文件中的参数。新配置的同步任务,请在此处配置startTime。
> selectSql:查询源数据表的sql语句
> insertSql:插入到目标表的sql,切记字段要与selectSql中的一一对应
> **sql动态参数说明**
> 有必要着重解释一下selectSql中的几个动态参数,因为增量同步是针对大数据量设计的,所以在执行查询时,不能一次将所有数据查询出来,这样做有内存溢出的风险。因此,分页查询是必须要使用的。本软件巧妙的将sql语句配置出来,就是为了解决不同数据库分页查询语句不一致。若不配置出来,由系统去计算分页语句,那么计算过程太复杂,支持的数据库也是有限的(前面说过“理论上支持任何jdbc可访问的关系数据库”就是这个道理)。将sql语句配置出来后,开发者还可以按照需求定制条件,过滤掉无需同步的数据,岂不妙哉。
> 既然将sql语句配置出来,且要支持分页查询,那么必然需要将分页信息动态传参给sql语句。以下4个参数,系统会判断如果存在那么动态传递进去,由jdbcTemplate负责替换并执行。
> startTime:开始时间分界点
> startRow:开始行,动态计算
> endRow:结束行,动态计算
> pageSize:分页大小,会替换为bean中的pageSize值
> 虽然说这4个参数都不是必须的,但如果不用startTime标识分界点,那么和全量同步又有什么分别呢?然后也没有限制一定要使用分页查询,因为有的系统数据增长不快,可以一次将新增的所有数据查询并同步到目标表。
+ **配置定时器**
```xml
```
> 本示例使用cron表达式配置定时器,也可以配置固定频率同步,请参考spring的定时配置文档
+ **运行程序**
`com.zle.datasync.Application`
最后,尽情enjoy本软件带来的乐趣吧!