java数据迁移程序

2023-11-19

环境:mysql 目标:亿级数据迁移 最终耗时:1-2小时(服务器更佳),建议在晚上或者没人访问的情况下操作

思路:

​ 1.不能一下将所有数据,导入到目标数据表,耗时太久,且占用资源,所有就用程序批量执行,每次执行一个范围段,比如第一个线程: 1 -1000,第二个线程: 1001-2000,第三个线程:2001-3000这样,当然我这里是为了方便理解,实际这个是要根据自己插入数据的性能,来进行调整的,当前数据库,大概每次插入28w数据,耗时在2-5秒,所以每次也就是,1-280000,2800001-560000这样子执行。

​ 2.我这里插入的目标数据表是有索引的,因为业务需要,如果不加索引,插入速度会更好,但是,查询的话,影响很大,看你的需求,如果不是需要查询的表,可以不加。这里加上的原因就是,如果等数据导入进去,再添加索引,会锁表,并且耗时很久也没执行成功。

public class Test{

		
 		 public static void main(String[] args) {
        //数据库中总记录数
        long rows = 2177847407L;

        //核心线程数
        int kThreads = Runtime.getRuntime().availableProcessors() * 2;
        //任务数(这里需要求一下平均每个任务需要执行的任务id大小是多少,实际测试中,20-30w 快则 2秒,慢则3-5秒,这个阈值是比较理想的 也就是 总记录数/任意数 等到想要的平均任务数)
        Long talks = (rows / 8000) + 1;

				//线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(kThreads);

        //数据起始位
        Long startIndex = 0L;
        
        //数据结束位
        Long endIndex = startIndex+talks;

		//存放线程执行结果
        List<Future> list = new Vector<>();
        //执行多少次任务 = 结束位置不小于总记录数 
        for (Long i = 0l; i < rows; i = endIndex) {
            final Future submit = threadPool.submit(new DataThread(startIndex, endIndex, new FaultRealMapper()));
            //每次执行完成,开始id+1
            startIndex = endIndex+1;
            //结束id=开始id+任务数
            endIndex = startIndex+talks;
            list.add(submit);
        }
        //打印结果
        list.forEach(dx -> {
            try {
                System.out.println(dx.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });


    }


		//线程操作资源类
    class DataThread implements Callable {

        private FaultRealMapper faultRealMapper;
        private Long startId, endId;

        public DataThread(Long startId, Long endId, FaultRealMapper faultRealMapper) {
            this.faultRealMapper = faultRealMapper;
            this.startId = startId;
            this.endId = endId;
            System.out.println("startId:" + startId + ",endId:" + endId);
        }

        @Override
        public Object call() throws Exception {
          	System.out.println("开始执行");
         		faultRealMapper.insert(startId, endId);
            return "执行成功";
        }
    }
}

Sql:

<insert id="insert">
  Insert INTO `newTable` ( `car_id`, `insert_time`)
  SELECT `car_id`, `insert_time`
  ROM `oldTable`
  WHERE id&lt;=#{endId} and id>=#{startId} 
 </insert>

Mapper.class

package com.test.mapper;


@Mapper
public interface FaultRealMapper {
  
  	//插入
    void insert(Long startId, Long endId);
}

看到文章末尾的,可以看下的我的程序人生这篇文章,主要是讲我在编程这条路上的经历,祝愿对你有用,感谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java数据迁移程序 的相关文章

  • 使用 Intellij Idea 和 gradle 在应用程序引擎上调试 localhost

    我正在使用 IntelliJ 社区添加并使用 Gradle 构建应用程序引擎标准环境应用程序 在迁移到 IntelliJ 和端点框架之前 我使用的是 Android Studio 我无法调试我的本地主机 我添加了 jvmFlags 如下所述
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 有没有创建 Cron 表达式的 Java 代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个 Java 代码来根据用户输入创建一个 cron 表达式 用户输入是时间 频率和执行次数 只需从评论中添加 自己创建 即可
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Mockito 使用 @Mock 时将 Null 值注入到 Spring bean 中?

    由于我是 Spring Test MVC 的新手 我不明白这个问题 我从以下代码中获取了http markchensblog blogspot in search label Spring http markchensblog blogsp
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • python基础:面向对象一些简单案例:计算圆的面积和周长,烤羊肉串

    1 计算圆的面积和周长 from math import pi class Circle def init self r self r r def zhouchang self return 2 pi self r def area sel
  • shell编程计算1-1000中所有3或5的倍数之和

    bin bash sum 0 int 1 while int lt 1000 do if int 3 0 int 5 0 then sum sum int fi let int done echo sum bin bash sum 0 fo
  • Spring Security 自定义用户认证

    一 PasswordEncoder 在 Configuration注解的类下注入bean import org springframework security crypto bcrypt BCryptPasswordEncoder imp
  • C++ 数据类型

    使用编程语言进行编程时 需要用到各种变量来存储各种信息 变量保留的是它所存储的值的内存位置 这意味着 当创建一个变量时 就会在内存中保留一些空间 可能需要存储各种数据类型 比如字符型 宽字符型 整型 浮点型 双浮点型 布尔型等 的信息 操作
  • AI绘图实战(六):制作一张庆祝五一劳动节的海报

    S AI能取代设计师么 I 至少在设计行业 目前AI扮演的主要角色还是超级工具 要顶替 除非甲方对设计效果无所畏惧 预先学习 安装及其问题解决参考 Windows安装Stable Diffusion WebUI及问题解决记录 运行使用时问题
  • JUMPSERVER+ZABBIX二次开发

    未完待续 1 apps assets models assets py 添加字段 zabbix group id models IntegerField null True blank True verbose name Zabbix Gr
  • Rust对文件的操作

    一 文件IO操作 在类unix系统中 一切都是文件 所以说广义的文件操作 其实包括很多 Socket 管道 内存映射等等 其实文件操作无论怎么变化 主流仍然是对外设的访问 计算机本身的组成 是一系列的硬件整合在一起的 单纯的只有CPU和内存
  • WSL 2是什么

    Windows Subsystem for Linux WSL 适用于 Linux 的 Windows 子系统是微软在Windows 10上提供的一项供用户快速运行Linux命令和工具的功能 相比前一代的WSL WSL 2提供更全的兼容性
  • 【vue2】vue2中引入jquery

    文章目录 安装 main js中引用 修改webpack配置 把以下三步做好 就不会出现 jquery is not define 的问题了 安装 npm i jquery S main js中引用 import from jquery V
  • 918. 环形子数组的最大和

    918 环形子数组的最大和 难度中等192 给定一个由整数数组 A 表示的环形数组 C 求 C 的非空子数组的最大可能和 在此处 环形数组意味着数组的末端将会与开头相连呈环状 形式上 当0 lt i lt A length 时 C i A
  • Docker安装RabbitMQ docker安装RabbitMQ完整详细教程

    Docker安装RabbitMQ docker安装RabbitMQ完整详细教程 Docker 上安装 RabbitMQ 3 12 的步骤 选择要安装的RabbitMQ 版本 1 拉取 RabbitMQ 镜像 2 创建并运行容器 3 Rabb
  • H5移动端便捷兼容测试方式

    一 准备 1 谷歌浏览器 2 H链接 3 主流设备分辨率 尺寸 二 步骤 1 打开F12 选择手机模式 2 看顶部设备信息 点击 县级弹窗最底部的edit进入编辑模式 3 添加想要测试的设备 设备的宽高需要按照手机的分辨率和像素值计算 以i
  • Oracle的三种高可用集群方案

    转载自 http www cnblogs com baiboy p orc2 html label1 Oracle的三种高可用集群方案 1 RAC Real Application Clusters 多个Oracle服务器组成一个共享的Ca
  • Java 基本数据类型之间的运算规则

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 这里只讨论七种基本数据类型变量间的运算 不包含boolean类型的 1 自动类型提升 结论 当容量小的数据类型的变量与容量大的数据
  • 水果识别系统-tensorflow项目

    介绍 水果识别系统 可识别15种水果 人工智能 机器学习 模式识别项目 编程语言Python 基于tensorflow机器学习库通过卷积神经网络对数据集进行训练 经过多次迭代训练得到模型 预测精度达到99 技术栈 python tensor
  • Spring AOP、拦截器、过滤器的区别

    一 区别与概念 Filter过滤器 拦截web访问url地址 Interceptor拦截器 拦截以 action结尾的url 拦截Action的访问 Spring AOP拦截器 只能拦截Spring管理Bean的访问 业务层Service
  • 解决dataframe格式表格的合并

    这几天遇到了一个关于表格合并的问题 其实问题很简单 对于两个表格df1和df2 取出df1的每一行特征和df2的每一行的特征合并 再将label合并 但是看了很多pandas关于表的合并 其并不适用到我这个问题 所以在此我想简单的总结一下关
  • 使用虚拟机安装ikuai软路由系统,搭建pppoe拨号服务器

    搭建pppoe拨号服务器 一 搭建ikuai软路由系统 1 VMware版本 2 ikuai官网上下载系统镜像 3 使用虚拟机安装ikuai系统 4 登录ikuai管理界面 二 安装win7虚拟机验证拨号功能 三 其他电脑要使用这个pppo
  • 【解决】使用IDEA创建springboot项目时,出现错误Cannot download ‘https://start.spring.io‘: connect timed out

    第一步创建项目 create New Project 第二步 错误的意思为 初始化失败 https start spring io 请检查URL 网络和代理设置 错误消息 无法下载 https start spring io 连接超时 解决
  • java数据迁移程序

    环境 mysql 目标 亿级数据迁移 最终耗时 1 2小时 服务器更佳 建议在晚上或者没人访问的情况下操作 思路 1 不能一下将所有数据 导入到目标数据表 耗时太久 且占用资源 所有就用程序批量执行 每次执行一个范围段 比如第一个线程 1