(四)自制数据同步程序 二次开发(模块化)开发说明

二次开发 基于spring ioc 本系统实现了模块化开发部署 动态上传jar包 动态加载bean 将自定义的同步逻辑加载到同步任务里。不需要重启。

编写方法如下 首先创建一个空工程
在这里插入图片描述
填写相关内容 点击保存
在这里插入图片描述
完整信息如下
在这里插入图片描述
将需要的启动工程放入你的工程代码内 作为子工程
在这里插入图片描述
放置后如下
在这里插入图片描述
idea效果如下
在这里插入图片描述

然后将子工程导入到idea中
在这里插入图片描述
点击pom文件导入

在这里插入图片描述
导入之后注意配置 source root 和resources root
在这里插入图片描述
webapp 文件目录页要配置
在这里插入图片描述
再创建一个工程编写代码
在这里插入图片描述
配置如下(示例)
在这里插入图片描述
创建完成效果如下
在这里插入图片描述
在启动工程添加 刚刚创建的工程依赖
在这里插入图片描述
在刚刚创建的工程中添加如下依赖
1.2.1-RELEASE

com.github.niupengyu.schedule
ahead-schedule-statistics
${ahead.schedule.version}

创建一个service 开始编写代码 此工程要实现一系列接口
在这里插入图片描述

下面简单介绍下数据同步的流程
1.按时间同步(源库有一个更新时间的字段)
首先设置一个开始时间,比如要从 2020-01-01 00:00:00开始同步数据。
第二步:查询 2020-01-01 00:00:00 到现在最新是数据最后一次更新时间是多少 比如源库最新的数据更新时间是 2020-03-23 00:00:00。
第三步:查询 2020-01-01 00:00:00 到 2020-03-23 00:00:00 之间的数据有多少。比如有20000条
第四步:通过分页的方式查询 第一页数据(设置每页10000条),
第五步:循环每一条数据 进行数据处理 比如:合并字段 转换类型 调用算法分析等。
第六步:通过批处理保存数据
第七步:开始下一页循环。
其中 查询最新更新时间,查询数据量,循环处理每一条数据,保存数据 这几部同步程序预留接口 通过实现接口来实现这这几步。达到自定义同步的效果。

设置分页可以减少数据库查询一次返回的数据量大小,源库数据库不收控制。查询太多会出现源库内存不足的情况 导致源库奔溃。同时也减少数据同步服务器内存的占用。

以下是要实现的所有接口 说明

在这里插入图片描述

实现 对账功能 读、写接口要同时实现。

接口分为读、写 两种,这两种接口须组合使用
组合方式如下。

用途
PageTimeCompareDataReaderBatchWriter,BatchCompareWriter按时间分页查询、修改或插入
PageTimeCompareDataReaderBatchDeleteBeforeInsertWriter,BatchCompareWriter按时间分页查询、 先删除后插入
PageTimeCompareDataReaderBatchInsertWrite,BatchCompareWriter按时间分页查询、插入不判断重复
PageCompareDataReaderBatchWriter,BatchCompareWriter按分页查询、修改或插入
PageCompareDataReaderBatchDeleteBeforeInsertWriter,BatchCompareWriter按分页查询、 先删除后插入
PageCompareDataReaderBatchInsertWrite,BatchCompareWriter按分页查询、插入不判断重复
AllCompareDataReaderBatchWriter,BatchCompareWriter全量查询、修改或插入
AllCompareDataReaderBatchDeleteBeforeInsertWriter,BatchCompareWriter全量查询、 先删除后插入
AllCompareDataReaderBatchInsertWrite,BatchCompareWriter全量查询、插入不判断重复
AllTimeCompareDataReaderBatchWriter,BatchCompareWriter按时间全量查询、修改或插入
AllTimeCompareDataReaderBatchDeleteBeforeInsertWriter,BatchCompareWriter按时间全量查询、 先删除后插入
AllTimeCompareDataReaderBatchInsertWrite,BatchCompareWriter按时间全量查询、插入不判断重复

接口方法说明:
一些列举的是上面接口的所有方法 根据业务需要选择不同的接口会有不同的方法需要实现。



{

    /**
     * 全量查询数据库数据
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readCompareData() throws Exception {
        return null;
    }

    /**
     * 按时间查询对账数据列表
     * @param start 开始时间
     * @param end 结束时间
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readCompareData(String start, String end) throws Exception {
        return null;
    }

    /**
     * 查询源库对账数据数量
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readCompareDataTotal() throws Exception {
        return 0;
    }

    /**
     * 查询目标库对账数据数量 
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readTargetDataTotal() throws Exception {
        return 0;
    }

    /**
     * 分页查询对账数据列表
     * @param page 页数
     * @param size 页码
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readCompareData(int page, int size) throws Exception {
        return null;
    }

    /**
     * 按时间查询源库对账数据数量
     * @param start
     * @param end
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readCompareDataTotal(String start, String end) throws Exception {
        return 0;
    }

    /**
     * 按时间查询目标库对账数据数量
     * @param start 开始时间
     * @param end 结束时间
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readTargetDataTotal(String start, String end) throws Exception {
        return 0;
    }

    /**
     * 按时间 分页 查询对账数据数量
     * @param page 页数
     * @param size 每页数据数量
     * @param start 开始时间
     * @param end 结束时间
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readCompareData(int page, int size, String start, String end) throws Exception {
        return null;
    }

    /**
     * 全量查询源库数据
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readData() throws Exception {
        return null;
    }

    /**
     * 按时间查询源库数据
     * @param start
     * @param end
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readData(String start, String end) throws Exception {
        return null;
    }

    /**
     * 按分页查询源库数据
     * @param page 页数
     * @param size 每页条数
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readData(int page, int size) throws Exception {
        return null;
    }

    /**
     * 全量读取源库数据数量
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readDataTotal() throws Exception {
        return 0;
    }

    /**
     * 按时间查询数据数量
     * @param start 开始时间
     * @param end 结束时间
     * @return 数据数量
     * @throws Exception
     */
    @Override
    public int readDataTotal(String start, String end) throws Exception {
        return 0;
    }

    /**
     * 按分页 时间查询源库数据
     * @param page 页数
     * @param size 每页条数
     * @param start 开始时间
     * @param end 结束数据
     * @return 数据列表
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> readData(int page, int size, String start, String end) throws Exception {
        return null;
    }

    /**
     * 查询一条数据
     * @param map 数据全部值
     * @return 返回新数据
     * @throws Exception
     */
    @Override
    public Map<String, Object> selectOne(Map<String, Object> map) throws Exception {
        return null;
    }

    /**
     * 同上
     * @param primaryKey 主键对象
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> selectOne(PrimaryKey primaryKey) throws Exception {
        return null;
    }

    /**
     * 查询一条数据
     * @param map 数据对象
     * @return 返回插入条数
     * @throws Exception
     */
    @Override
    public int insert(Map<String, Object> map) throws Exception {
        return 0;
    }

    /**
     * 初始化方法。
     * @param timerParam
     * @throws Exception
     */
    @Override
    public void init(TimerParam timerParam) throws Exception {

    }

    /**
     * 返回目标库主键
     * @return
     */
    @Override
    public PrimaryKey goalId() {
        return null;
    }

    /**
     * 同步结束执行方法
     * @throws Exception
     */
    @Override
    public void end() throws Exception {

    }

    /**
     * 返回源库 数据id
     * @param map
     * @return 主键对象
     * @throws Exception
     */
    @Override
    public PrimaryKey selectId(Map<String, Object> map) throws Exception {
        return null;
    }

    /**
     * 返回源库id
     * @return 主键对象
     */
    @Override
    public PrimaryKey sourceId() {
        return null;
    }

    /**
     * 删除一条数据
     * @param map
     * @return
     * @throws Exception
     */
    @Override
    public int delete(Map<String, Object> map) throws Exception {
        return 0;
    }

    /**
     * 查询列表中的数据是否在数据库中
     * @param list 查询的数据集合
     * @return 返回查询到的存在的数据id 集合
     * @throws Exception
     */
    @Override
    public Set<String> in(List<Map<String, Object>> list) throws Exception {
        return null;
    }

    /**
     * 对比一条数据是否存在
     * @param map 对比的数据
     * @param set 上个方法查到的数据id集合
     * @return
     * @throws Exception
     */
    @Override
    public boolean compareOne(Map<String, Object> map, Set<String> set) throws Exception {
        return false;
    }

    /**
     * 执行批量更新
     * @param batchList
     * @return 更新数量 -1 代表异常
     * @throws Exception
     */
    @Override
    public int executeUpdate(BatchList batchList) throws Exception {
        return 0;
    }

    /**
     * 添加到批处理列表  这个方法可以 加入自定义逻辑 比如数据分析 字段合并等
     * @param batchList 列表对象
     * @param map 要处理的数据
     * @throws Exception
     */
    @Override
    public void addUpdateBatch(BatchList batchList, Map<String, Object> map) throws Exception {

    }

    /**
     * 更新一条数据
     * @param map 要更新的数据
     * @return 更新数量
     * @throws Exception
     */
    @Override
    public int update(Map<String, Object> map) throws Exception {
        return 0;
    }

    /**
     * 查询数据是否存在
     * @param map
     * @return
     * @throws Exception
     */
    @Override
    public int hasOne(Map<String, Object> map) throws Exception {
        return 0;
    }

    /**
     * 同上
     * @param primaryKey 数据id对象
     * @return
     * @throws Exception
     */
    @Override
    public int hasOne(PrimaryKey primaryKey) throws Exception {
        return 0;
    }

    /**
     * 执行批量删除
     * @param batchList 处理列表
     * @param list 删除的列表
     * @return 删除数量
     * @throws Exception
     */
    @Override
    public int executeDelete(BatchList batchList, List<Map<String, Object>> list) throws Exception {
        return 0;
    }

    /**
     * 执行批量插入
     * @param batchList 处理列表
     * @param list 插入的列表
     * @return
     * @throws Exception
     */
    @Override
    public int executeInsert(BatchList batchList, List list) throws Exception {
        return 0;
    }

    /**
     * 添加自定义批处理队列
     * @return
     */
    @Override
    public String[] initBatchQueue() {
        return new String[0];
    }

    /**
     * 执行批量插入
     * @param batchList 处理列表
     * @return 成功数量
     * @throws Exception
     */
    @Override
    public int executeInsert(BatchList batchList) throws Exception {
        return 0;
    }

    /**
     * 添加到批处理列表
     * @param batchList 处理对比
     * @param map 要添加的对象
     * @throws Exception
     */
    @Override
    public void addInsertBatch(BatchList batchList, Map<String, Object> map) throws Exception {

    }
}

测试之前配置扫描的包名(你写的类包路径这里没有 )
在这里插入图片描述

编写完成后通过这个类启动测试

配置完如下
在这里插入图片描述

然后启动 访问端口在 application-dev.yml 文件中配置

其中要依赖的jar包是我自己打包的 已上传到maven中央仓库
https://mvnrepository.com/search?q=niupengyu
链接: https://mvnrepository.com/search?q=niupengyu.
代码地址
链接:https://pan.baidu.com/s/16r_CjL-wiCH5xLfmh-tS0g
提取码:2krd

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值