应用场景:
离线应用程序数据同步到服务器端
服务器端数据同步到离线应用程序
同步记录表设计:
名
类型
不是null
主键
备注
id
int
√
√
主键id
start_id
int
被同步表数据,开始id
end_id
int
被同步表数据,结束id
end_upate_time
timestamp
同步结束时的时间(被同步表最后一条同步数据创建时间)
sync_type
varchar
同步类型
create_time
timestamp
√
创建时间
创建同步记录表sql文件:
CREATE TABLE `sync_record` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`start_id` int(11) DEFAULT NULL COMMENT '被同步表数据,开始id',
`end_id` int(11) DEFAULT NULL COMMENT '被同步表数据,结束id',
`end_upate_time` timestamp(4) NULL DEFAULT NULL COMMENT '同步结束时的时间(被同步表最后一条同步数据创建时间)',
`sync_type` varchar(3) DEFAULT NULL COMMENT '同步类型',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='同步记录表';
本篇博客介绍的是Java程序实现Mysql数据同步,要对抽象类有深刻的理解,不然会对代码逻辑很懵懂,不懂得同学可以看我这篇博客回忆一下Java基础知识:
Java抽象类
编写同步数据逻辑抽象类代码:
根据主键id同步
AbstractSyncByIdService.java(抽象类)
@Service
public abstract class AbstractSyncByIdService {
private static final Logger logger = LoggerFactory.getLogger(AbstractSyncByIdService.class);
@Autowired
private SyncDao syncDao;
/**
* 获取同步的上一个id
*
* @author HeLiu
* @date 2018/7/18 11:20
*/
public Integer queryPreviousId(String syncType) {
return syncDao.queryPreviousId(syncType);
}
/**
* 异常或者结束时,保存或者更新本次的同步记录
*
* @author HeLiu
* @date 2018/7/18 11:39
*/
protected void saveOrUpdateSyncRecord(Integer startId, Integer endId, String syncType) {
boolean exsitFlag = syncDao.queryExsitBySyncType(syncType);
//如果存在该同步类型的 同步记录,则只更新endId ; 不存在,则插入该类型的同步记录
if (exsitFlag) {
syncDao.updateEndIdBySyncType(syncType, endId);
} else {
syncDao.saveSyncRecord(syncType, startId, endId);
}
}
/**
* 执行同步,同步中的业务逻辑,数据之间的同步先后关系,都在这里编写
*
* @a