java多线程查询数据库(分段查询)
根据数据集合的大小,所开线程的数量,计算每个线程需要执行查询的数据量。
计算出SQL语句中每个查询的起始位置和结束位置下标。
每个线程,查询各自的范围内的数据。
public void queryByThread() { // 数据集合大小,由调用者自己指定 int listSize = 100; // 开启的线程数 int runSize = 20; // 一个线程处理数据条数,如果库中有100条数据,开启20个线程,那么每一个线程执行的条数就是5条 int count = listSize / runSize;//5 // 创建一个线程池,数量和开启线程的数量一样 ExecutorService executor = CreateThreadUtil.createThread(runSize); // 计算sql语句中每个分页查询的起始和结束数据下标 // 循环创建线程 //此处调用具体的查询方法 System.out.println("开始查询"); for (int i = 0; i < runSize; i++) { int index = i * count; int num = count; executor.execute(new Runnable() { @Override public void run() { try { //查询的结果如何保存下来,会不会存在覆盖的问题 System.out.println("每次查询的下标:" + index + ",条数:" + num); List<Text> textList = textMapper.queryByThread(index, num); //这里做处理信息的方法 } catch (Exception e) { System.out.println("查询失败" + e); } } }); } // 执行完关闭线程池 executor.shutdown(); }
创建线程池:
package com.klay.service.impl; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class CreateThreadUtil { public static ThreadPoolExecutor createThread(int runSize) { ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() .setNameFormat("测试信息").build();//创建线程工厂 //创建线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(runSize, runSize, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); return executor; } }