多线程处理慢sql查询以及List(Array)的拆分

系统数据量不大,但是访问速度特别慢,使用多线程优化一下!!!

优化结果:访问时间缩短了十几秒  25s --> 8s

一、List的拆分:Iterables.partition

注意: 引入的包为google名下的

    Iterables.partitions(List list , int size);  // list表示需要被拆分的集合,size表示拆分后的集合的元素个数

   例如:size=3,表示会拆分为2个集合,第一个集合中的元素为{1,2,3},第二个集合中的元素为{4,5}

      size=2,表示会拆分为3个集合,分别为{1,2} {3,4} {5}  以此类推

ps: 集合的合并:

List list = new ArrayList();

List list1 = new ArrayList();

 list.addAll(list1);

import com.google.common.collect.Iterables;  

List<String> strList = new ArrayList<String>();
strList.add(1);
strList.add(2);
strList.add(3);
strList.add(4);
strList.add(5);
Iterable<List<String>> splitStringlList = Iterables.partition(strList, 3); //3表示拆分后的集合元素的数量

二、Array的拆分:Arrays.asList(ArrayObj)

先将数组转换为List,然后再按照第一方法去拆分。

String[] validRiderArray = [1,2,3,4,5];
ArrayList<String> validArrayList = new ArrayList<String>(Arrays.asList(validRiderArray));

三、多线程处理类:

Runtime.getRuntime().availableProcessors();//返回到Java虚拟机的可用的处理器数量
package com.chinalife.proposal.common.util;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import org.springframework.stereotype.Component; import com.google.common.util.concurrent.ThreadFactoryBuilder;
/**
* 固定线程个数的线程池工具类
* */ public class SimpleFixedThreadPoolUtil {
/** 默认线程个数 */
private static final int DEFAULT_THREAD = Runtime.getRuntime().availableProcessors();//返回到Java虚拟机的可用的处理器数量
/** 线程池个数: 默认为: Runtime.getRuntime().availableProcessors() * 2 */
public static int THREADPOOL_NUM = DEFAULT_THREAD * 2;
private static ExecutorService executor = Executors.newFixedThreadPool(THREADPOOL_NUM,
new ThreadFactoryBuilder().setNameFormat("SimpleFixedThreadPool- %d: ").build()); /**
* 提交任务,任务执行后无返回值
*
* @param task
*/
public static void addTask(Runnable task) {
executor.execute(task);
} /**
* 提交具有返回值的任务
* @param task
* @return
*/
public static <T> Future<T> addTask(Callable<T> task) {
Future<T> future = executor.submit(task);
return future;
} /**
* 关闭线程池
*/
/*public void shutdown() {
executor.shutdown();
}*/
}

四、多线程处理慢查询使用示例:

JunitTest:

/**
* 多线程处理慢sql查询示例
* @throws Exception
*/
@Test
public void testAddTaskCallables() throws Exception {
String role = "Agent";
String nodeid = "2";
String subnodeid = "3";
long time = System.currentTimeMillis();
List<OnlProposalRolePrdRelation> rolePrdlist = webProposalService.getAvailableProductListByRoleAndID(role,nodeid, subnodeid);
Iterable<List<OnlProposalRolePrdRelation>> result = Iterables.partition(rolePrdlist, 30);
Iterator<List<OnlProposalRolePrdRelation>> iterator = result.iterator();
List<Future<List<OnlProposalRolePrdRelation>>> futures = new ArrayList<>();
while (iterator.hasNext()) {
List<OnlProposalRolePrdRelation> listTemp = iterator.next();
Future<List<OnlProposalRolePrdRelation>> future = SimpleFixedThreadPoolUtil
.addTask((Callable<List<OnlProposalRolePrdRelation>>) () -> {
List<OnlProposalRolePrdRelation> relations = null;
try {
relations = webProposalService.filterByCriteria(listTemp, 20, "1", "1", "0");
return relations;
} catch (Exception e) {
e.printStackTrace();
}
return relations;
});
futures.add(future);
}
List<OnlProposalRolePrdRelation> proposalResultList = new ArrayList<OnlProposalRolePrdRelation>();
for (Future<List<OnlProposalRolePrdRelation>> future : futures) {
while (!future.isDone()) {
Thread.sleep(100);
}
List<OnlProposalRolePrdRelation> relations = future.get();
System.out.println(relations.size());
proposalResultList.addAll(relations); }
logger.debug("time 3 =" + (System.currentTimeMillis() - time) / 1000);
System.out.println("stop");
}

 实际应用:

        ArrayList<String> validArrayList = new ArrayList<String>(Arrays.asList(validRiderArray)); 

        //step1 method start
//List<TblProposalRiderAttr> tblProposalRiderAttrList = getValidRiderListStep1(validRiderArray, parameter,tblProposalProductSetting, tPresentrelationForRider );
Iterable<List<String>> splitValidArrayList = Iterables.partition(validArrayList, 15);
Iterator<List<String>> iterator = splitValidArrayList.iterator();
List<Future<List<TblProposalRiderAttr>>> tblRiderFutures = new ArrayList<Future<List<TblProposalRiderAttr>>>();
while (iterator.hasNext()) {
List<String> tmpValidArrayList = iterator.next();
//调用多线程执行 future为单个list的返回结果; tblRiderFutures为所有返回结果的集合
Future<List<TblProposalRiderAttr>> future = SimpleFixedThreadPoolUtil
.addTask((Callable<List<TblProposalRiderAttr>>) () -> {
List<TblProposalRiderAttr> tmpTblRiderList = null;
try {
//调用step1方法进行筛选附加产品信息 进行多线程处理的方法
tmpTblRiderList = getValidRiderListStep1(tmpValidArrayList, parameter,tblProposalProductSetting,tPresentrelationForRider);
return tmpTblRiderList;
} catch (Exception e) {
e.printStackTrace();
}
return tmpTblRiderList;
});
tblRiderFutures.add(future);
}
//将筛选后的结果添加到集合中
List<TblProposalRiderAttr> tblProposalRiderAttrList = new ArrayList<TblProposalRiderAttr>();
for (Future<List<TblProposalRiderAttr>> future : tblRiderFutures) {
while (!future.isDone()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
tblProposalRiderAttrList.addAll(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
//step1 method end

参考链接:

https://www.cnblogs.com/dolphin0520/p/3949310.html

https://blog.csdn.net/qq1137623160/article/details/79772505

多线程处理慢sql查询小笔记~的更多相关文章

  1. SQL查询(笔记2——实体查询)

    SQL查询(笔记2——实体查询) 二.实体查询 如果查询返回了某个数据表的全部数据列,且该数据表有对应的持久化类映射,我们就把查询结果转换成实体查询.将查询结果转换成实体,可以使用SQLQuery提供 ...

  2. SQL查询小案例

    这是一篇自学MySQL的小案例,下面是部分数据信息:goods表 1.查询cate_name为‘超级本’的商品名称.价格 SELECT `name`, priceFROM goodsWHERE cat ...

  3. SQL 学习小笔记

    1.FOUND_ROWS() 题目: ,; 在上边sql中使用什么选项可以使 SELECT FOUND_ROWS()忽略LIMIT子句,返回总数? *答案* : SQL_CALC_FOUND_ROWS ...

  4. SQL脚本小笔记

    --表添加字段.说明--- --脚本 alter table 表名 ADD 字段名 FLOAT(类型) NOT NULL Default 0(默认值) EXECUTE sp_addextendedpr ...

  5. MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 2) --日志系统,一条SQL查询语句如何执行 MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关.上一篇中记录了一 ...

  6. MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行

    最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...

  7. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  8. spring MVC +freemarker + easyui 实现sql查询和执行小工具总结

    项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...

  9. SQL查询条件生成小工具

    最近运维数据,经常遇到需要在sql条件中个In('',''....)个字符串的情况,于是在网上找了个小工具改造一下,先用着: 效果如图: using System; using System.Coll ...

随机推荐

  1. SuperMap 二维地图和三维场景弹窗窗口大小控制

    注:此处所说的弹窗窗口,主要指的是那些弹窗窗口中嵌入iframe,包含信息页面的窗口大小控制. 1.首先来了解下 SuperMap 示例中的处理方案 二维的处理方式 //初始化Anchored类 po ...

  2. DirectX之顶点法线的计算

    首先要明白,顶点法线存在的原因:确定灯光照射到物体表面的角度.所以一提到顶点法线,肯定要进行与灯光相关的运算了. 下面是顶点法线的计算方式 假如 A.B.C三个顶点构成一个三角形,它们对应的顶点法线分 ...

  3. Opencv各种编码器下视频文件大小对比

    转载自http://blog.csdn.net/dcrmg/article/details/52215930 做视频样本切割,切片用ffv1编码,比原数据大了几十倍,看到了这篇文章,防止找不到记录一下 ...

  4. 单调队列 Monotonic Queue / 单调栈 Monotonic Stack

    2018-11-16 22:45:48 一.单调队列 Monotone Queue 239. Sliding Window Maximum 问题描述: 问题求解: 本题是一个经典的可以使用双端队列或者 ...

  5. 日常英语---十二、MapleStory/Monsters/Level 1-10(Horny Mushroom)

    日常英语---十二.MapleStory/Monsters/Level 1-10(Horny Mushroom) 一.总结 一句话总结: horny-['hɔːnɪ]-adj.角的 Another m ...

  6. xpath是什么(入门教程)

    xpath是什么(入门教程) 一.总结 一句话总结:一句话,XPath 是一门在 XML 文档中查找信息的语言.简单来说,html类似于xml结构,但是没有xml格式那么严格. 在xml中查找信息 包 ...

  7. java ----> 类转换异常

    com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy 两个原因: 1.懒加载 在we ...

  8. Practical Node.js (2018版) 第3章:测试/Mocha.js, Chai.js, Expect.js

    TDD and BDD for Node.js with Mocha TDD测试驱动开发.自动测试代码. BDD: behavior-driven development行为驱动开发,基于TDD.一种 ...

  9. python记录_day31 进程同步和进程通信

    一.进程同步 1.同步锁(又叫互斥锁) 加锁的代码以后,同一时间内只能被一个进程执行 from multiprocessing import Process, Lock def fun(loc): l ...

  10. 【基础知识】【1】CDN

    正文: CDN:Content Delivery Network,内容分发网络.使用户访问离ta最近的资源服务器,优化访问速度 优点: 1,内容可以共享,不同站点的同一文件可以不用多次缓存 2,增加下 ...