Java项目数据迁移怎么做的

2023-10-27

Java项目数据迁移怎么做的?

  • 1、A表到B表找字段映射,即两个不同库表先做好数据字段的对应和补齐;

  • 2、代码程序(java)做功能,从一个数据库表中读出数据,然后写到另一个数据库表中;

技术历练点

  • 多线程;
    • 使用线程池:
    • 确定核心线程池的数量;
  • 使用多线程后,怎么精确确定迁移任务结束时间;
    • 使用原子类:AtomicInteger;
    • 使用Future列表存放每个线程任务句柄,如果列表中所有任务都结束了,则整个任务结束;
  • 批量读写;
    • 批量从A表读数据,关键是向B表写数据时,需完全避免单条数据插入数据库,要以批量形式;
    • 如果有关联关系时,需要依赖上次的主键ID的,在批量创建数据后,直接利用对象数据的信息,避免批量再从数据库取数据;
  • 同一个项目中两套数据源配置;
    • transactionManager;
    • 具体参见底页代码示例;
    • java @Transactional(transactionManager = "creedTransactionManager", rollbackFor = Exception.class)
  • 日志监控;
    • 关键节点日志;
    • 失败信息日志;
    • StopWatch监控各代码块耗时占比,以便后续优化;
  • 先迁移基本信息,后RPC补充缺失的信息;
    • 避免RPC耗时较长,数据异常时阻塞流程;
  • 怎么保证不会迁移重复数据?
    • 取原始数据的时候是无交叉分段取值(0,999)(1000,1999)等;
    • 可以给主键加唯一索引;
    • 程序中使用SHA算法提取分段id的摘要,然后放进缓存中,下一批次数据来的时候先判断摘要是否存在,如果存在则跳过;
  • 批量迁移过程中不断初始化新对象也较为耗时,可以使用设计模式之对象池模式;类似于线程池和连接池。
  • 切记要记得对称两边表字段的大小,不要因为字段多长导致线程挂起失败;
  • 迁移数据怎么设计成增量迁移,不要因为部分数据问题导致删库-重新迁移;
    • Redis记录失败的数据ID;
    • 数据分段,记录失败的开始和结束位置;
  • 对外提供的迁移接口要做异步处理;
  • 对于迁移过程中出现的异常,一定要打印日志(最好是error级别的),方便具体问题排查(20200411加班就是因为错误日志用的info级别,导致排查了好几个小时,大大增加无效工作时间);
  • 优化分页查询
    • 利用索引ID,可优化分页查询效率;(大批量数据要利用索引,在我们的项目中最初使用 limit-size方式分页取值,发现越往后分页取值越慢)
<select id="batchSelectOrders" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from db_trade.zcy_orders where id > #{id,jdbcType=BIGINT} and need_done_migration = 1 order by id  limit #{size}
  </select>

技术提升/优化

迁移关注点:

  • 第一版:主要注重数据准确性;
  • 第二版:优化迁移速度;刚开始600条/秒 -> 1800条/秒 -> 20000条/秒;

参考链接

  • 数据源配置简示:
@Configuration
@MapperScan(basePackages = "xxx.trade.creed.migration.dal.creed.dao", sqlSessionTemplateRef = "creedSqlSessionTemplate")
public class DbCreedConfig {

    /**
     * mapper-locations 配置
     */
    @Value("${creed.mybatis.mapper-locations}")
    private String creedMapperLocation;

    @Bean(name = "creedDataSource")
    @ConfigurationProperties(prefix = "creed.mybatis")
    public DataSource creedDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "creedSqlSessionFactory")
    public SqlSessionFactory creedSqlSessionFactory(@Qualifier("creedDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(creedMapperLocation));
        return bean.getObject();
    }

    @Bean(name = "creedTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("creedDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "creedSqlSessionTemplate")
    public SqlSessionTemplate creedSqlSessionTemplate(@Qualifier("creedSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}```
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java项目数据迁移怎么做的 的相关文章

随机推荐

  • OSPF从初学到放弃 2.1

    本来要开开心心写博客的 结果刚刚看见之间知乎上的两个评论被要求修改 两篇评论都是关于同一个问题的 我都有理由怀疑是资本的力量太强大了 说好的舆论自由呢 一群骗子 好气好气好气 OSPF协议及作业 前言 一 OSPF是什么 仔细说一下 二 聊
  • 一小时入门Python爬虫,连我都会了!Python爬取租房数据实例

    一 什么叫爬虫 爬虫 又名 网络爬虫 就是能够自动访问互联网并将网站内容下载下来的程序 它也是搜索引擎的基础 像百度和GOOGLE都是凭借强大的网络爬虫 来检索海量的互联网信息的然后存储到云端 为网友提供优质的搜索服务的 二 爬虫有什么用
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    文章目录 前言 什么是二分查找算法 1 二分查找 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 在排序数组中查找元素的第一个和最后一个位置 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 搜索插入位置
  • USB MSC类存储设备及FatfsR0.14移植

    USB MSC类存储设备及FatfsR0 14移植 效果演示 配置说明 USB MSC类配置 FatFs移植 FatFs的配置 驱动接口 FatFs测试 USB MSC驱动接口完善 效果演示 这里演示了 FatFs挂载SPI Flash设备
  • java中的锁(基础篇)

    乐观锁和悲观锁 悲观锁 适合写操作多的场景 先加锁可以保证写操作时的数据正确 乐观锁 实际开发 Synchronized关键字 悲观锁 加了后同一时间有且只有一个线程可以进入锁内 1 修饰实例方法 作用于当前实例对象加锁 进入同步代码前要获
  • ReinHard颜色迁移

    看到颜色迁移 觉得还蛮有意思的 遂简单看了一下 代码实现好像有错误 但是不知道错误出在哪里 算法参考 https blog csdn net sin geek article details 22443537 https blog csdn
  • SD卡的控制方法与时序

    1 1 SD卡的命令格式 SD卡的指令由6字节 Byte 组成 如下 Byte1 0 1 x x x x x x 命令号 由指令标志定义 如CMD39为100111即16进制0x27 那么完整的CMD39第一字节为01100111 即0x2
  • [Numpy] mgrid与ogrid

    文章目录 numpy mgrid numpy ogrid numpy mgrid numpy lib index tricks nd grid的替代 在给定范围内返回一个ndarray 是网格上的点 import numpy as np 起
  • webpack安装和使用及超详细配置一个基本vue项目的全部流程(包括路由、less、引入图片渲染)

    文章目录 一 搭建一个简单的webpack项目 1 准备工作 2 初始化项目 3 安装并使用webpack 1 使用npm语句安装webpack和webpack cli 2 检测是否安装成功 需要注意点是由于webpack并不是全局安装的
  • 【BMC】简介

    什么是BMC 在介绍BMC之前需要了解一个概念 即平台管理 platform management 平台管理表示的是一系列的监视和控制功能 操作的对象是系统硬件 比如通过监视系统的温度 电压 风扇 电源等等 并做相应的调节工作 以保证系统处
  • Linux配置sar服务

    Linux配置sar服务 下面以suse 为例 其他系统类似 检查是否有安装sar服务 sar服务包含在sysstat软件包中 rpm qa grep sysstat 如果没有安装执行下面的命令安装 zypper install sysst
  • OCR-APP开发总结(一)

    一 解决删除 运行模式 布局的问题 1 直接将对应的xml部分删除 2 将 Java中MainActivity中引用对应的ID部分删除 并将运行模式的值默认 3 效果图 二 裁剪方法 方法1 android自带的crop进行裁剪 缺点 裁剪
  • Spring MVC类型转换的相关说明

    转自 Spring MVC类型转换的相关说明 下文讲采用示例的方式 讲述相关类型说明 如下所示 insert jsp页面的代码如下
  • C++ 命名空间 & 模板

    命名空间 为了区分不同库中相同名称的函数 类 变量等 引入概念 命名空间 它可作为附加信息来帮助区分它们 使用了命名空间即定义了上下文 本质上就是定义了一个范围 定义命名空间 命名空间的定义使用关键字 namespace 后跟命名空间的名称
  • python实现从零搭建图书管理系统

    学习目标 tornado入门学习 异步服务器学习 异步数据库操作 一 虚拟环境 1 1 虚拟环境的创建 mkvirtualenv tornado py3 p python3 1 2 安装tornado pip install tornado
  • QT学习(一)—— 第一个QT项目

    1 1 新建一个项目 添加项目名称 选择Qwidget类 暂时不选择Generate form那个 补充 这里介绍了一下widget mainWindow dialog三种类的关系 编译器用QT自带的 创建完毕 1 2 项目介绍 1 2 1
  • python爬取内容剔除nbsp_Python正则获取、过滤或者替换HTML标签的方法

    本文实例介绍了Python通过正则表达式获取 去除 过滤 或者替换HTML标签的几种方法 具体内容如下 python正则表达式关键内容 python正则表达式转义符 匹配除换行符以外的任意字符 w 匹配字母或数字或下划线或汉字 s 匹配任意
  • CVPR2023:BiFormer阅读笔记

    目录 前言 1 模型的特点 2 双层路由注意力机制 BRA 3 BiFormer的结构 前言 BiFormer是CVPR2023的一篇文章 文中提出自注意力机制作为Transformer的核心模块 可以帮助网络捕捉长距离上下文依赖 但是这种
  • 基于MFC-MSComm控件的PC与单片机串口通信编程

    作者 uedsr542 来源 51hei 使用工具Visual C 6 0 9针RS232串口线一条 P0口带上拉的LED的51最小系统版 打开软件 新建 gt MFC AppWizard exe 再填写工程名和路径 gt 基于对话框 不需
  • Java项目数据迁移怎么做的

    Java项目数据迁移怎么做的 1 A表到B表找字段映射 即两个不同库表先做好数据字段的对应和补齐 2 代码程序 java 做功能 从一个数据库表中读出数据 然后写到另一个数据库表中 技术历练点 多线程 使用线程池 确定核心线程池的数量 使用