【集合拆分+多线程并行处理,拿来即用】

文章目录

    • 一.业务场景
    • 二.拆分流程
    • 三. 简单上个List拆分的demo
    • 四.测试结果
    • 五.小结

一.业务场景

节假日后第一天,上完班有点累,回到家稍微写点简单的东西。

  • 我们项目里面有这样一业务场景,要计算全公司所有人某几个月内每天的考勤机打卡加班工时结果,如果直接查询出所有人的打卡记录(动不动几十万上百万条)记录,再以人为维度分组计算,这样程序要跑特别特别久。
  • 每次业务如果需要我们重新跑一次结果,要等这么久的话有点浪费彼此的时间,所以有没有办法来提高效率让程序跑快一点呢?
    没错,那就是集合拆分使用多线程把串行变成并行处理 + 统一收集结果再用Mybatis的批处理,这里先只介绍集合拆分串行变成并行处理,不详细介绍其他的了。
    当然在线程里面执行批量插入效率也可以,但是得看分的线程数量,效率则不同,具体看文章【Mybatis批处理 vs 集合拆分多线程批量插入 性能对比】

二.拆分流程

我们业务里面我是这样来拆分的:

  1. 先查出所有的人,大概5W多个人员id
  2. 把5W多个人员id集合拆分子List,每个子List大小设置为200
  3. 然后在线程里面去根据人员id查询打卡记录表,得到每个人的每天打卡记录,这样sql查询也快些了,最终再去计算每个人的结果。

当然我还做了其他很多优化:
1.比如利用TransmittableThreadLocal主线程传个空的并发安全List(Collections.synchronizedList‌适用于写多读少)进子线程,每个子线程满足特定条件都加锁再收集结果在这集合中。
2.最终等所有子线程都收集完了结果,再通过MyBatis的批处理操作统一插入该结果集合。
补充:在MyBatis中,批处理操作是一种高效执行多条语句的方式,特别是当你需要在一个事务中插入、更新或删除多条记录时。批处理可以显著减少与数据库的交互次数,从而提高性能。
执行批处理的基本步骤:
开启批处理模式:在获取SqlSession时,需要指定执行器(Executor)类型为ExecutorType.BATCH。
执行SQL语句:执行需要批处理的SQL语句,此时语句并不会立即执行,而是被添加到批处理队列中。
提交事务:调用SqlSession.commit()方法,此时MyBatis会将批处理队列中的语句一次性发送给数据库执行。
处理批处理结果:提交事务后,可以通过批处理结果进行后续处理。
3.用统一收集结果再通过Mybatis批处理进行整个改造后,我们项目里面这个任务由原来的6-7分钟跑完只需要1-2分钟。 亲测有效!绝没有吹牛逼!

三. 简单上个List拆分的demo

这里只举测试例子(项目代码不便贴)。List拆分成子List,然后根据子List的人员id去查询表,再做逻辑计算处理,跟我业务场景是一样的。

    public void parallelSubList() {List<Integer> list = new ArrayList<>();for (int i = 1; i <= 1000; i++) {list.add(i);}int totalCount = list.size();int pageSize = 50;int threadCount = totalCount % pageSize == 0 ?  totalCount / pageSize : totalCount / pageSize + 1;log.info("线程拆分数量:{}",threadCount);CountDownLatch countDownLatch = new CountDownLatch(threadCount);for (int index = 0; index < threadCount; index++){List<Integer> subList = list.subList(index * pageSize, index == threadCount - 1 ? totalCount : (index + 1) * pageSize);tulingThreadPoolExecutor.submit(()->{try {log.info("当前执行线程名称:{},subList集合范围:{}",Thread.currentThread().getName(), JSONUtil.toJsonStr(subList.get(0) + "-" + subList.get(subList.size()-1)));}catch (Exception e){log.info("当前任务执行失败:{}",e.getMessage());}finally {// 请注意,这里无论成功或者失败,必须countDown,不然会造成计数器归不了零,从而造成程序一直会阻塞在await方法countDownLatch.countDown();}});}try {countDownLatch.await();}catch (InterruptedException e){log.info("任务出错了,中断异常:"+e.getMessage());e.printStackTrace();}}

四.测试结果

在这里插入图片描述

五.小结

这里先简单写下,主要是觉得List拆分这块算是个模板,也是个思路,可以拿来即用的,在咱们之后业务场景里遇到大的集合拆成小集合这是一个复制粘贴的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544596.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

docker从0到1运行mysql(最详细且绝对成功版)

前置环境 CentOS7.8 安装docker yum install -y docker 启动docker并检查docker状态 systemctl start docker systemctl status docker 这样即正常 设置镜像加速 修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值 vim /etc/docker/daemon.json …

set的使用

序列式容器和关联式容器 序列式容器&#xff1a; 前⾯我们已经接触过STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间…

监控和维护 Linux 系统的健康状态:从服务启动故障到操作系统查询

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务&#xff0c;因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数&#xff1a; -d 将 Ntopng 进程放入后台执行。默认情况下&#xff0c;Ntop 在前台运行。 -u 指定启动Ntopng执行的用户&#xff0c;默认为…

C++ SLT标准模板简介

STL全称是standard template libaray 标准模板库&#xff0c;这个库是C库中十分重要的一部分&#xff0c;里面涵盖可复用的组件库&#xff0c;而且是一个包罗了数据结构与算法的软件框架。 STL各主要版本 stl库最初是由Alexander Stepanov、Meng Lee在惠普工作室中完成的原始…

Multisim简体中文版百度云下载(含安装步骤)

如大家所熟悉的&#xff0c;Multisim是一款基于电路仿真的软件&#xff0c;可用于电子工程师、电子爱好者和学生进行电路设计、分析和调试。Multisim具有完整的电路设计和仿真功能&#xff0c;可支持模拟电路、数字电路&#xff0c;以及混合电路。 Multisim可以模拟不同电路的…

基于vue框架的大参林药品信息管理系统的设计与实现8b4gt(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,药品分类,药品信息,医生 开题报告内容 基于Vue框架的大参林药品信息管理系统的设计与实现开题报告 一、引言 随着医疗健康行业的快速发展和信息化浪潮的推进&#xff0c;药品信息管理已成为提升医疗服务效率、保障患者用药安全、…

怎样摆脱繁重的“物理集中”,轻松连接与交付全域数据,真正实现“敏捷用数”?

Data Fabric&#xff08;数据编织&#xff09;&#xff0c;作为新一代的数据管理策略&#xff0c;其核心在于通过逻辑层面的数据整合与加工&#xff0c;打破物理集中的局限&#xff0c;实现数据的无缝共享与高效利用。以往&#xff0c;我们更多地从理论层面探讨数据编织的技术与…

RK3229 MS8416 MS8406调试

1、I2S做从机模式&#xff0c;音频芯片做主模式 由于音频芯片做从模式声音可能会失真&#xff0c;所以必须使得I2S1做从模式&#xff0c;音频芯片做主模式 ms84x6 {compatible "rockchip,ms84x6";pinctrl-0 <&lk_ms84x6_io>;//ms84x6_sda <&gpi…

目标检测系列(三)yolov2的全面讲解

YOLOv2&#xff08;论文原名《YOLO9000: Better, Faster, Stronger》&#xff09;作为该系列的第二个版本&#xff0c;对原始YOLO进行了显著的改进&#xff0c;进一步提高了检测速度和准确度。在精度上利用一些列训练技巧&#xff0c;在速度上应用了新的网络模型DarkNet19&…

小阿轩yx-Ansible部署与应用基础

小阿轩yx-Ansible部署与应用基础 前言 由于互联网的快速发展导致产品更新换代速度逐步增长&#xff0c;运维人员每天都要进行大量的维护操作&#xff0c;按照传统方式进行维护使得工作效率低下。这时部署自动化运维就可以尽可能安全、高效的完成这些工作。 Ansible 概述 什…

自闭症寄宿学校陕西:提供综合发展的教育环境

星贝育园&#xff1a;自闭症儿童的综合发展摇篮 在自闭症儿童教育的广阔领域里&#xff0c;寄宿制学校以其独特的康复环境和全方位的支持体系&#xff0c;为这些特殊的孩子点亮了希望之灯。广州的星贝育园自闭症儿童寄宿制学校&#xff0c;正是这样一所充满爱心与专业的机构&a…

探索自闭症寄宿学校:为孩子的未来铺设坚实基石

探索自闭症寄宿学校&#xff1a;星贝育园——为孩子的未来铺设坚实基石 在自闭症儿童成长的道路上&#xff0c;选择一所合适的学校&#xff0c;无疑是为他们铺设坚实基石的关键一步。广州的星贝育园自闭症儿童寄宿制学校&#xff0c;以其专业的教育理念、全面的支持体系和温馨…

使用PLSQL Developer快速连接数据库

文章目录 前言一、定义设置方式二、固定用户设置方式三、连接设置方式总结前言 PLSQL Developer是一个集成开发环境,由Allround Automations公司开发,专门面向Oracle数据库存储的程序单元的开发。该工具提供了多种设置方式,便于使用者在不需要输入用户名称、密码的情况下,…

鸿蒙 如何退出 APP

terminateSelf() 停止Ability自身 在EntryAbility中这么使用 this.context.terminateSelf()在Pages页面中这么使用 import { common } from kit.AbilityKit (getContext(this) as common.UIAbilityContext)?.terminateSelf() 也可以直接封装&#xff1a; import common f…

查了好几天的问题终于画上了句号

问题背景&#xff1a; 产品接到前方实施反馈9月02日有些订单查不到签名值&#xff0c;对于医院验签查不到签名值&#xff0c;就无法完成验签数据归档。 问题追踪过程&#xff1a; 1 首先查数据库&#xff0c;发现订单id确实查不到对应的detail数据&#xff1b; 第一直觉是否是…

如何使用ssm实现基于Java web的高校学生课堂考勤系统的设计与实现+vue

TOC ssm686基于Java web的高校学生课堂考勤系统的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#x…

SpringBoot集成微信小程序Demo

一、前言 小程序是一种全新的连接用户与服务的方式&#xff0c;它可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。 微信小程序官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/ 二、技术栈 SpringBoot 2.0MyBatis-P…

不同类型的企业该如何挑选适合的供应商管理系统?

供应商管理对企业降低成本、维持稳定的货品来源起着重要的作用&#xff0c;在选择供应商管理系统时&#xff0c;需要考虑多重因素&#xff0c;正所谓没有最好只有最合适&#xff0c;需要结合企业自身需求进行多方面考量才能做出明智的决策。 本文将对国内外制造业都在使用的供…

找最小数 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给一个正整数NUM1&#xff0c;计算出新正整数NUM2&#xff0c;NUM2为NUM1中移除N位数字后的结果需要使得NUM2的值最小。 输入描述 输入的第一行为一个字符串&#xff0c;字…