标签:
工作中遇到的场景,这里写个例子出来,实际应用比此处更为健壮和完善
应用场景:
对一张表10万条数据(或100万或1亿+)进行更新操作或写入操作;
菜鸟是一条一条的执行吧,这显然不行啊
我在实际项目中是这样应用的, 批量更新!当然这显然是不够的 要线程批量更新才对吧!
怎么做呢?
举例1:10万条数据 ,我1000条1000条的处理 就是,10万/1000 = 100 ,
这里我就用100个线程同时处理,每个线程负责1000条数据,这里有个关键点,处理的数据不能重复!
给个代码示例吧:
线程池中线程数量可以根据 数据量/单个线程处理数量 来计算
public class DySchedule { private static AtomicInteger line = new AtomicInteger(0); static ExecutorService pool = Executors.newFixedThreadPool(100); public static int getLine(){ return line.addAndGet(1000); } public static void doJob(){ for (int i = 0;i<100;i++){ Thread thread = new MyThread(); pool.execute(thread); } pool.shutdown(); } public static void main(String[] args) { DySchedule.doJob(); } }
public class MyThread extends Thread { @Override public void run() { System.out.println("线程:" + Thread.currentThread().getName()); Integer num = DySchedule.getLine(); System.out.println("startline = " +(num-1000)+",endline = " + num); } }
线程:pool-1-thread-1 startline = 0,endline = 1000 线程:pool-1-thread-2 startline = 1000,endline = 2000 线程:pool-1-thread-5 线程:pool-1-thread-3 startline = 2000,endline = 3000 startline = 3000,endline = 4000 线程:pool-1-thread-4 startline = 4000,endline = 5000 线程:pool-1-thread-6 线程:pool-1-thread-7 startline = 6000,endline = 7000 startline = 5000,endline = 6000 线程:pool-1-thread-9 startline = 7000,endline = 8000 线程:pool-1-thread-8 startline = 8000,endline = 9000 线程:pool-1-thread-10 startline = 9000,endline = 10000 线程:pool-1-thread-12 startline = 10000,endline = 11000 线程:pool-1-thread-11 startline = 11000,endline = 12000 线程:pool-1-thread-16 startline = 12000,endline = 13000 线程:pool-1-thread-15 线程:pool-1-thread-19 startline = 14000,endline = 15000 startline = 13000,endline = 14000 线程:pool-1-thread-20 startline = 15000,endline = 16000 .... ....
比如以上
线程:pool-1-thread-1
startline = 0,endline = 1000 处理数据库0-1000行的数据
线程:pool-1-thread-2
startline = 1000,endline = 2000 处理1000-2000行的数据
接下来的批量任务内容是不是简单多了,不多少了,记住这里关键点就是保证数据不重复!,不遗漏!
这样子的思路几百万或者几千万级别的批量处理是没有什么问题的,
但是 你有几个亿或者几百亿的数据需要批量处理怎么办呢? 小伙子 别急,作为一名资深程序员当然还是有办法的
需要吧以上思路或方案设计成分布式,多任务,多线程的schedule 就可以了,
累了,点到为止吧..草草记下,不足之处可以留言
标签:
原文地址:http://my.oschina.net/dyyweb/blog/524082