需求:更新机构表的字段,该字段的内容为包括当前机构的机构号和所有父机构的机构号以逗号拼接的形式保存到数据库

该表的数据量大约为10万条(数据库类型:postgresql)

10万条数据每1000条跑一次事务(机构表:organization,机构号:brh_code,父机构号:up_brh_code)

1.最开始的用法

public List<Record> findAllParentData(String orgCode){String sql = "WITH RECURSIVE r AS (  " +" SELECT brh_code, up_brh_code FROM organization WHERE brh_code = ? " +" UNION ALL " + " SELECT o.brh_code, o.up_brh_code FROM organization o,r " +" WHERE o.brh_code = r.up_brh_code) " +" SELECT r.brh_code FROM r ";return Db.find(sql, orgCode);
}

这个方法会查当前机构的所有的父级机构,然后遍历拼接完后再执行update

更新10万条数据本地运行了5个多小时,生产环境运行了2个多小时,这样肯定是不行的,主要是这个循环的sql运行时间比较长

2.采用多线程更新

控制层代码(一个定时任务:每1000跑一个事务)

public class UpdateOrgFamilyField implements Job {private final int THREAD_COUNT = 10;private final CountDownLatch latch = new CountDownLatch(THREAD_COUNT);private static Logger log = Logger.getLogger(UpdateOrgFamilyField.class);@Overridepubli void execute (JobExecutionContext jobExecutionContext ) {int startLimit = 0;int limitLength = 1000;boolean next = true;ExecutorService es = Executors.newFixedThreadPool(THREAD_COUNT);try {log.info("开始执行任务");while (next) {//每次获取1000条数据List<Record> list = OrganizationJobService.me.queryOrgTable(startLimit, limitLength);//每list.size()跑一次事务OrganizationJobService.me.updateOrgFamilyField(list, es);startLimit += limitLength;if (list.size() < limitLength) {next = false;}}log.info("任务执行完成");latch.await();es.shutdown();} catch (Exception e) {log.error("执行更新任务出错");}}}

业务层代码

public class OrganizationJobService {public static final OrganizationJobService me = Duang.duang(OrganizationJobService.class, Tx.class);private static final Logger log = Logger.getLogger(OrganizationJobService.class);/***查询机构表,每次查询limitLength条数据*/public list<Record> queryOrgTable(int startlimit, int limitLength) {return Db.find("select id, brh_code, up_brh_code, org_family " + " from organization order by id asc limit ? offset ? ", limitLength, startlimit);}/***更新机构表的org_family字段*/public void updateOrgFamilyField(List<Record> list, ExecutorService es){int count = 0;for (final Record record : list) {es.submit(new Runnable() {@Overridepublic void run () {StringBuilder sb = new StringBuilder();String brhCode = record.getStr("brh_code");//机构号String upCode = record.getStr("up_brh_code");//父机构号sb.append(brhCode).append(",").append(upCode);//获取父级机构号的字符串String codeStr = queryBrhCodeByUpCode(upCode, sb);record.set("org_family", codeStr);Db.update("organization", "id", record);}}); count++;log.info("更新了" + count + "条数据");}log.info("成功更新了" + list.size() + "条");}/***轮询获取父机构的字符串*/private String queryBrhCodeByUpCode (String brhCode, StringBuilder sb){String sql = "select up_brh_code from organization where brh_code = ?";Record first = Db.findFirst(sql, brhCode);if (first == null) {return sb.toString();}String code = first.getStr("up_brh_code");if (StringUtils.isNotEmpty(code)) {sb.append(",").append(code);}queryBrhCodeByUpCode(code, sb);return sb.toString();}
}

更新10万条数据生产环境仅仅用了20秒,效率还是非常明显的

开启线程数量:https://www.cnblogs.com/warehouse/p/10810338.html

java多线程批量更新数据库的数据相关推荐

  1. java mongodb批量更新数据_MongoDB的批量查询条件进行批量更新数据

    今天遇到这样一个场景:在Java中批量更新MongoDB数据,不过每次更新的条件有不一样,那如何有效地进行更新操作呢? 刚开始的时候,我是想到循环批量更新操作,即每一种查询条件进行一次批量更新过程,这 ...

  2. mysql语句批量更新数据库_sql 更新批量数据库语句

    JDBC(六)批量处理sql 批量更新是分组在一起的一批更新,并以"批量"方式发送到数据库,而不是逐个发送更新. 一次发送一批更新到数据库,比一个一个发送更快,等待每个更新完成. ...

  3. 基于Java线程池读取数据库中数据(学习+运用)

    基于Java线程池读取数据库中数据(学习+运用) 以下是学习内容 Main.java import java.util.concurrent.ArrayBlockingQueue; import ja ...

  4. java多线程批量读取文件(七)

    新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一 ...

  5. solr使用网页浏览器批量导入数据库中数据(本案例是mysql)

    如果想要知道如何安装solr,集成IKAnalyzer中文分词器,批量导入数据库数据,java使用参照以下本博主博文: 安装solr https://blog.csdn.net/u013294097/ ...

  6. mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  7. java excel批量导入数据库数据_Java实现Excel数据批量导入数据库

    Java实现Excel数据批量导入数据库 概述: 这个小工具类是工作中的一个小插曲哦,因为提数的时候需要跨数据库导数... 有的是需要从oracle导入mysql ,有的是从mysql导入oracle ...

  8. java excel导入并多线程批量插入数据库

    最近写了个excel导入并多线程持久化到数据库的功能,捣鼓了一天才弄好,先记录下来防止自己忘了. (1)先controller类中方法. @AccessLog@ApiOperation(value = ...

  9. java查询到更新之前的数据_Java对数据库的查询和更新操作详解

    这篇文章主要介绍了使用Java对数据库进行基本的查询和更新操作,是Java入门学习中的基础知识,需要的朋友可以参考下 数据库查询 利用Connection对象的createStatement方法建立S ...

最新文章

  1. 35.2. Subversion 版本控制
  2. c# java数据类型不同点
  3. Spring核心部分之AOP,aspectJ框架实现AOP,切入点表达式
  4. 人一生中最该看清的5个真相
  5. OCP-052考试题库汇总(58)-CUUG内部解答版
  6. java有没有自定义好的按钮_java – 带有nimbus的自定义JButton
  7. 【SpringMVC 笔记】SpringMVC 原理 + 入门项目(xml 配置版 vs 注解版)
  8. java 可重入锁 clh_Java可重入锁原理
  9. 卡拉OK歌词同步播放
  10. Smart3D运行过程中遇到的问题(持续更新)
  11. 计算机图像处理发展前景,数字图像处理发展前景
  12. 恋爱测试题测男生软件,男友求生欲测试题大全
  13. 浏览器显示海康摄像头实时预览画面纯前端解决方案
  14. Mozilla Add-ons学习笔记(1)
  15. JavaScript小白入门篇(二、高级语法之 BOM 详解)
  16. 不一样的视觉盛宴,Python实现3D地图
  17. TCP 底层处理流程图
  18. 电路板元件符号及名称概述
  19. NR PRACH(五) type1 RA(4-step)基本过程
  20. 多模态特征表示和融合

热门文章

  1. 通话蓝牙耳机哪个牌子好?四款通话质量好的蓝牙耳机推荐
  2. 第17章 脚本化CSS
  3. 联想拆机+加装内存条+加装固态硬盘
  4. 章鱼网络:赋能应用链,开启WEB3.0
  5. div css圆环布局,CSS圆环样式
  6. 安卓APP:隐私合规检测常见问题建议总结
  7. (全栈旅行足迹地图打卡网站 0-1)-旅行足迹点在地图上的显示以及预览大图-08(WebGIS Vue-js-go-mysql)
  8. 439 三元表达式解析器
  9. 抖音开放平台授权登录PHP,抖音向第三方平台开放“一键发布”功能 大疆、网易游戏等已接入...
  10. 多媒体计算机探索 教案,课文《电子计算机与多媒体》教案