多线程处理慢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. 在linux中,我为什么不能安装VMware Tools?

    在linux中,我为什么不能安装VMware Tools? 应该是操作不正确导致,以下为linux安装VMware Tools的方法. 1.在安装Linux的虚拟机中,单击“虚拟机”菜单下的“安装Vm ...

  2. python中函数与函数式编程(一)

    在学习之前,我们先去区分面对对象.面对过程.函数式编程他们之间的区别,从改图可以看出,他们之间不是完全相同的,也不是没有任何相同点的 1.函数和过程的基本认识 def func1(): "& ...

  3. gdb 的 symbos 加载详情(set verbose on)

    http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc 两个重要参数 set verbose on d ...

  4. spring cloud: zuul(三): ribbon负载均衡配置

    zuul的routes配置下path/url组合不支持负载均衡 下面介绍zuul的routes配置下的path/serviceId负载均衡配置 spring-boot-user微服务开启了:7901, ...

  5. Linux下编译安装MySQL

    一.环境准备yum install -y ncurses-devel libaio-develyum install -y cmake makeuseradd -s /sbin/nologin -M ...

  6. android -------- java虚拟机和Dalvik虚拟机

    java虚拟机 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.Java虚拟机屏蔽了 ...

  7. es的mapping设置

    自定义mapping的api PUT test_index { "mappings": { #mappings关键字 "doc": { #type " ...

  8. pytorch 中的 split

    Pytorch中的split问题: 1.使用torch.nn.Conv2d中有个参数是groups会将输入的feature map分组,此处需要注意的一点是分组之后各组的feature map的cha ...

  9. 1.numpy_overview

    官网文档:https://www.numpy.org.cn/ Numpy 简介 导入numpy Numpy是Python的一个很重要的第三方库,很多其他科学计算的第三方库都是以Numpy为基础建立的. ...

  10. 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成

    一.RPN锚框信息生成 上文的最后,我们生成了用于计算锚框信息的特征(源代码在inference模式中不进行锚框生成,而是外部生成好feed进网络,training模式下在向前传播时直接生成锚框,不过 ...