在业务系统中,经常利用补偿机制对一些历史进行刷新操作,特别是对热数据进行刷新操作时,要求刷的效率特别高,如果保证刷数据高效,也要能够保障不影响线上的正常业务呢,有以下几点需要注意。

背景:
数据库:mysql
开发语言:java

  1. 获取要清洗的记录的ID
    这里要一次性尽可能多的获取需要处理的纪录数,这里要注意不要获取太多字段,只需要获取主键即可,因为这个ID只是为了给线程分配任务用。每个线程在执行的清洗任务的时候,再查询需要更新的字段即可。
    这里有一个坑,也有一个技巧解决这个坑。如果顺序取数据,千万不要使用limit,因为limit 0,10000很快,但是limit 10000,20000就慢了,因为在执行limit 10000,20000的时候,实际上我们需要0到10000之间的数据,但是mysql还是会扫描这些记录的,这样要清洗整个表,而且整个表的纪录是上百万,上千万,那么越往后就越慢,会把mysql服务器搞垮。
    如果主键类型是int,并且是递增的,那么就可以使用这个特点,就上面查询下一次要清洗的数据范围的查询sql修改为 where id >= and id < 这样的方式,这样mysql的执行计划的type列就是rang,使用了索引,另外,只是查询ID,而且覆盖了索引,也就不需要回表查询了,很快的。
  2. 线程个数
    采用线程池,Executors.newFixedThreadPool(16),固定16个线程,16个线程已经很多了,要结合线上机器的core,如果线上的机器是2个core,那么搞16线程,资源都浪费线程之间的竞争和调度上面了。
    每个线程执行的任务数不要过大,过大了反而不能压榨线程了,既然搞了16线程,就让每个线程执行的任务数不要过大。

  3. insert 或者update的方式
    一般稍大点的(电商)互联网企业,线上使用mysql都是集群的,而且灾备考虑,都会部署多个机房,那么当数据变更时,就会垮机房同步,虽然有机房之间有专线,而且网卡的带宽千兆,但是,为了尽量不对线上业务造成影响,应该尽可能在业务低谷时进行清洗数据。
    一般要避免采用批量insert 或者批量update的方式,因为这样会造成锁表现象,应该在java程序端进行单条insert和upate,这里也要主要不要把线上的QPS搞的太高,这就需要进行执行一段,然后sleep下。

  4. 保留修改纪录和灰度进行演练
    毕竟是操作线上的数据,在灰度环境进行演练是非常必要的。另外,对于修改纪录要存档,不要仅仅通过数据库的操作日志进行回滚是不现实的。
    在进行目标表进行清洗的时候,有一种方案比较降低风险,就是采用中转表的方式,在中转表进行清洗,然后进行将表rename到目标表,不过,这里有一个限制,就是在清洗过程中,要保证中转表的数据要和目标表的数据完全一致,因为中转表的数据是来自目标表的。其实,这个就是和MYSQL数据升级是一样的道理,如果mysql一主一从,那么先升级从,升级,切换将从设置为主,然后对主进行升级。道理都差不多!

  5. 线程的同步控制
    既然一个任务分成很多的子任务,而且每个子任务用一个线程执行,那么一个完整的任务执行完毕了,任务才算真正完成,特别是那种顺序处理或者逻辑中依赖了顺序的清洗,所以,就要控制线程的同步,当所有的线程执行完毕后,才能算作本次任务执行完成。可以使用CountDownLatch来控制线程的同步。

  6. 基于第一点,那么可以将对一个表的清洗通过多个节点去执行,每个节点执行不同的任务,能够更高效,不过要注意关注下数据库的负载情况。

谈java多线程方式刷数据的一点建议相关推荐

  1. 浅谈Java多线程机制

    浅谈Java多线程机制 (-----文中重点信息将用红色字体凸显-----) 一.话题导入 在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度. ...

  2. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  3. java多线程方式轮询,深入理解JAVA多线程之线程间的通信方式

    一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过sy ...

  4. java多线程互斥锁_浅谈Java多线程互斥锁

    为了解决竞争条件带来的问题,我们可以对资源上锁.多个线程共同读写的资源称为共享资源,也叫临界资源.涉及操作临界资源的代码区域称为临界区(Critical Section).同一时刻,只能有一个线程进入 ...

  5. 浅谈Java 多线程同步

    最近在研究多线程同步的一些问题,整理了网上很多文档,在这里给大家分享下 Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终 ...

  6. 浅谈Java多线程同步机制之同步块(方法)——synchronized

    在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: 1 package com.jikexueyuan ...

  7. Java多线程系列(三):Java线程池的使用方式,及核心运行原理

    之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...

  8. Java多线程与并发系列从0到1全部合集,强烈建议收藏!

    在过去的时间中,我写过Java多线程与并发的整个系列. 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人. ...

  9. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

最新文章

  1. Python3中__init__.py文件介绍
  2. Git 面对不同的场景的命令使用
  3. 开发日记-20190517 关键词 函数式编程(一)
  4. Matlab:成功解决 Inner matrix dimension must agree
  5. vue --- 前端代理发送http请求
  6. 数字后端——时钟树综合
  7. ABP入门系列(8)——Json格式化
  8. jmeter tps指标在哪里看_性能之路——性能测试连载 (3)-性能指标
  9. CSS基础——CSS 三大特性【学习笔记】
  10. zedboard板子上呼吸灯的实现(第一版)
  11. SQL Server 游标
  12. 软件工程 - 个人博客系统 - 可行性分析与需求分析文档
  13. 夏普Android系统,夏普LCD-60\70TX85A及YunOS安卓运行环境安装指南
  14. 大型门户网站架构分析
  15. follow your heart
  16. 2020 SSR落地开花的三大机遇
  17. Android 开发之初识 Android
  18. Windows——如何关闭笔记本自带键盘
  19. 基于51单片机智能温控风扇LCD1602液晶显示红外遥控设计
  20. 计算机使用鼠标的课件,鼠标的基本操作ppt课件.ppt

热门文章

  1. 数据表(中间表)的设计:多对多关系
  2. 数据库建立索引怎么利用索引查询
  3. 小米官网(部分内容)
  4. 长沙医学院英语四级计算机,长沙医学院2018上半年英语四六级考试报名工作的通知...
  5. iphone模拟器截图方法
  6. iOS系统版本特性(7版本--14版本)
  7. 现代信息检索课程总结
  8. sdn网络实验的搭建--mininet
  9. ansible-playbook基于角色一键交付wordpress+zrlog+phpmyadmin项目
  10. oracle11g tmpfs参数设置