记一次数据修复,需要生成十万条sql进行数据回滚
一、背景
数据回滚
二、难点
2.1 需要处理的数据涉及多达数万个用户,每个用户涉及的表达到10个
2.2 时间紧急,需要快速回滚,数据需要完整
2.3 数据存在重复或空缺问题
三、解决方案
3.1 数据多,使用分批处理,把大任务分割成若干个小任务
3.2 时间紧,使用多线程CompletableFuture处理,提高处理效率
3.3 mysql数据有些是重复,需要去重,使用not exist处理,保障数据完整
四、案例代码
@Slf4j
public class DataRollBackProcessTest {// 自定义线程池ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 600,TimeUnit.SECONDS, new ArrayBlockingQueue<>(2000));@Testpublic void startTest() throws ExecutionException, InterruptedException {List<Integer> list = new ArrayList<>();for (int i = 1; i <= 100; i++) {list.add(i);}concurrentProcess(list);}/*** * 并行处理,全部异步任务执行完才一起返回** @param list* @throws ExecutionException* @throws InterruptedException*/public void concurrentProcess(List<Integer> list) throws ExecutionException, InterruptedException {// 定义一个集合切割为小任务时每个任务的大小,int taskSize = 5;List<List<Integer>> divideList = divide(list, taskSize);// 创建一个CompletableFuture数组,用于存储异步操作的结果CompletableFuture<Void>[] futures = new CompletableFuture[divideList.size()];// 循环10次,每次执行一次异步操作for (int i = 0; i < divideList.size(); i++) {int index = i;CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 异步操作,可以在这里执行你的任务try {simulateLongDurationTasks(divideList.get(index));} catch (InterruptedException e) {e.printStackTrace();}System.out.println("异步操作 " + index + " 执行完成");}, threadPoolExecutor);// 将CompletableFuture对象存储到数组中futures[i] = future;}// 使用CompletableFuture.allOf等待所有异步操作完成CompletableFuture<Void> allOf = CompletableFuture.allOf(futures);// 阻塞,等待所有异步操作完成allOf.get();System.out.println("所有异步操作执行完成");}/*** 集合切分** @param origin* @param size* @param <T>* @return*/public <T> List<List<T>> divide(List<T> origin, int size) {if (origin == null || origin.size() == 0) {return Collections.emptyList();}int block = (origin.size() + size - 1) / size;return IntStream.range(0, block).boxed().map(i -> {int start = i * size;int end = Math.min(start + size, origin.size());return origin.subList(start, end);}).collect(Collectors.toList());}/*** 模拟耗时的任务* <p>* 需求背景:* 需要把一组用户的数据复制到另一组用户,生成sql脚本如下,为了简略,* 使用Thread.sleep替换耗时任务* <p>* -- 把B用户的数据插入到A用户,且A用户不存在相同的数据* sql使用点1: INSERT INTO student from* sql使用点2: NOT EXISTS** INSERT INTO student (uid, STATUS, age, sex) SELECT* 61442, -- A用户* STATUS,* age,* sex* FROM* student t1* WHERE* t1.uid = 682801 -- B用户* AND t1. STATUS = 1* AND NOT EXISTS (* SELECT* t2.id* FROM* student t2* WHERE* t2.uid = 61442* AND t2.age = t1.age* AND t2.sex = t1.sex* );*/public void simulateLongDurationTasks(List<Integer> subList) throws InterruptedException {if (subList == null || subList.size() == 0) {return;}int sleepSeconds = subList.stream().mapToInt(e -> e).reduce(0, Integer::sum);log.info("thread id:{}, thread name:{}, thread states:{}, Thread.activeCount:{}, thread sleep:{}",Thread.currentThread().getId(),Thread.currentThread().getName(),Thread.currentThread().getState(),Thread.activeCount(),sleepSeconds);Thread.sleep(sleepSeconds);}
}
五、总结
使用分批处理,结合多线程,提高处理效率
多线程处理需要考虑系统资源竞争问题、顺序问题
相关文章:
记一次数据修复,需要生成十万条sql进行数据回滚
一、背景 数据回滚 二、难点 2.1 需要处理的数据涉及多达数万个用户,每个用户涉及的表达到10个 2.2 时间紧急,需要快速回滚,数据需要完整 2.3 数据存在重复或空缺问题 三、解决方案 3.1 数据多,使用分批处理,把大任务分割成若…...
[paddle]paddlehub部署paddleocr的hubserving服务
步骤如下: 第一步:首先需要安装好paddleocr环境已经paddlehub环境 第二步:下载paddleocr源码: git clone https://github.com/PaddlePaddle/PaddleOCR.git 然后切换到paddocr目录执行 新建个文件夹叫Inference把paddleocr模型…...
2024校招,网易互娱游戏测试工程师一面
前言 大家好,今天回顾一下,我前段时间参加的游戏测试工程师技术面试 两个面试官,一个提问,另一个负责记录 过程 自我介绍比赛经历介绍一下使用的博弈算法穷举算法对性能有什么影响怎么评估局面好坏出现的bug怎么解决的&#x…...
Linux Ubuntu搭建我的世界Minecraft服务器实现好友远程联机MC游戏
文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 前言 Li…...
Springboot对接ceph集群以及java利用s3对象网关接口与ceph集群交互
springboot中引入相关依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>regions</artifactId><version>2.22.13</version></dependency><dependency><groupId>software.amazon.awssdk<…...
nrm使用
为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下 包的镜像源。 //通过 npm 包管理器,将 nrm 安装为全局可用的工具 npm i nrm -g//查看所有可用的镜像源 nrm ls//将下载…...
06-微服务OpenFeigh和Sentinel持久化
一、OpenFeign基础应用 1.1 概念 OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访…...
docker 安装redis (亲测有效)
目录 1 安装 1 安装 1 将redis 的 tar 包 上传到服务器 上传之后tar 包,将他变成镜像 输入docker images,发现目前是没有镜像的,现在将tar 包变成镜像 docker load -i redis.tar以上就将tar 包变成镜像了 现在在宿主机找一个地方,存放数据…...
利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker
Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址:https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/blob/main/README_CN.md 步骤一&#…...
Vue3使用ElementPlus中的el-upload手动上传并调用上传接口
前端代码 <div class"upload-div"><el-uploadv-model:file-list"form.fileImageList"ref"uploadRef"capture"false"action"#"accept"image/*"list-type"picture-card":on-change"handleC…...
【Github3k+⭐️】《CogAgent: A Visual Language Model for GUI Agents》译读笔记
CogAgent: A Visual Language Model for GUI Agents 摘要 人们通过图形用户界面(Graphical User Interfaces, GUIs)在数字设备上花费大量时间,例如,计算机或智能手机屏幕。ChatGPT 等大型语言模型(Large Language Mo…...
【conda】pip安装报错,网络延时问题解决记录(亲测有效)
【conda】pip安装报错,网络延时问题解决记录 1. pip install 报错如下所示2. 解决方案: 1. pip install 报错如下所示 pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.…...
Spring Boot整理-Spring Boot的优势
Spring Boot 提供了多个显著的优势,特别是对于快速开发和简化 Spring 应用的配置和部署。这些优势包括: 简化配置:Spring Boot 的“约定优于配置”的原则意味着许多 Spring 应用的常见配置项被自动设置,这减少了开发人员需要编写和维护的配置代码量。快速启动和部署:Sprin…...
C++标准学习--decltype
decltype / auto 是具有类型推导功能的 类型 描述/占位 符 decltype: 获取对象或表达式的类型auto: 类型自动推导 decltype 可以获取变量类型, (并不同于python的type,但python能打印出type获取的名称, C通过typeid实现ÿ…...
Linux之静态库和动态库
目录 一、前言 二、对于库的理解 三、静态库 四、动态库 五、动静态库的加载 一、前言 在之前,我们讲了静态库和动态库,详情请跳转:静态库和动态库 下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以…...
erlang/OTP 平台(学习笔记)(三)
分布式 Erlang 借助于语言属性和基于复制的进程通信,Erlang程序天然就可以分布到多台计算机上。要问为什么,且让我们来看两个用Java或C这类语言写成的进程,它们运作良好并以共享内存为通信手段。假设你已经搞定了锁的问题,一切精…...
Spring整理-Spring框架中用了哪些设计模式
Spring框架广泛应用了多种设计模式,这些模式提高了框架的灵活性、可扩展性和可维护性。下面是在Spring框架中常见的一些设计模式: 单例模式(Singleton):用于在应用的整个生命周期内保持一个类的单个实例。在Spring中,Bean默认是单例模式。 工厂模式(Factory Pattern):…...
Poi实现根据word模板导出-图表篇
往期系列传送门: Poi实现根据word模板导出-文本段落篇 (需要完整代码的直接看最后位置!!!) 前言: 补充Word中图表的知识: 每个图表在word中都有一个内置的Excel,用于…...
windows或mac端口转发
摘要 在内网开发中,由于出于公司安全考虑,部分IP192.168.0.100访问只能针对固定IP192.168.0.200开放,此时我需要通过我的电脑192.168.0.300去访问,由于未对我电脑IP192.168.0.300授权,导致我访问不到,此时…...
Sakura启动器:零配置部署本地AI模型的终极解决方案
Sakura启动器:零配置部署本地AI模型的终极解决方案 【免费下载链接】Sakura_Launcher_GUI Sakura模型启动器 项目地址: https://gitcode.com/gh_mirrors/sa/Sakura_Launcher_GUI 还在为复杂的命令行参数和繁琐的模型配置而头疼吗?Sakura启动器正是…...
开源剧本AI落地实操:像素剧本圣殿+Dual-GPU并行推理完整教程
开源剧本AI落地实操:像素剧本圣殿Dual-GPU并行推理完整教程 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个开源项目将先进的AI推理能力与独特的8-Bit复古美学相结合&…...
深度解析:Element Plus架构设计与实现原理
深度解析:Element Plus架构设计与实现原理 【免费下载链接】element-plus 🎉 A Vue.js 3 UI Library made by Element team 项目地址: https://gitcode.com/GitHub_Trending/el/element-plus Element Plus作为Vue.js 3生态中最具影响力的企业级UI…...
FanControl完全指南:5分钟掌握Windows风扇智能控制
FanControl完全指南:5分钟掌握Windows风扇智能控制 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...
Ollama+Qwen2.5-VL搭建教程:打造你的智能视觉分析工具
OllamaQwen2.5-VL搭建教程:打造你的智能视觉分析工具 1. 引言:为什么选择Qwen2.5-VL 在当今AI技术快速发展的时代,视觉-语言多模态模型正成为解决复杂问题的关键工具。Qwen2.5-VL-7B-Instruct作为通义千问系列的最新成员,在视觉…...
Galaxy UI组件库深度解析:3000+开源UI元素的完整实践手册
Galaxy UI组件库深度解析:3000开源UI元素的完整实践手册 【免费下载链接】galaxy The largest Open-Source UI Library! Community-made and free to use. Made with either CSS or Tailwind. 项目地址: https://gitcode.com/gh_mirrors/gal/galaxy 在当今快…...
pybind11进阶指南:如何高效封装C++类供Python调用(附常见问题解决方案)
pybind11进阶指南:如何高效封装C类供Python调用(附常见问题解决方案) 在当今高性能计算和科学计算领域,C与Python的结合已成为开发者工具箱中不可或缺的组合。C提供底层性能优势,而Python则以其简洁语法和丰富生态著称…...
GLM-4.1V-9B-Base行业实践:农业病虫害田间照片识别与防治建议辅助
GLM-4.1V-9B-Base行业实践:农业病虫害田间照片识别与防治建议辅助 1. 农业场景下的视觉AI需求 在现代农业生产中,病虫害防治一直是困扰农户的核心问题。传统识别方法依赖农技人员现场勘查,效率低下且成本高昂。根据农业农村部数据ÿ…...
Optick多线程性能分析:游戏引擎中的并发性能优化实战
Optick多线程性能分析:游戏引擎中的并发性能优化实战 【免费下载链接】optick C Profiler For Games 项目地址: https://gitcode.com/gh_mirrors/op/optick Optick是一款专为游戏开发打造的C性能分析工具,能够精准捕捉多线程应用中的性能瓶颈&…...
颠覆原神体验:Snap Hutao智能助手如何重构你的游戏效率
颠覆原神体验:Snap Hutao智能助手如何重构你的游戏效率 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hu…...
