多线程处理慢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. Codeforces 960F - Pathwalks

    960F - Pathwalks 思路: ORZ 杜老师 用map写1e5个树状数组,骚操作 记Q为query和update次数,则节点个数约为Q*log(N) 代码: #include<bit ...

  2. SpringBoot集成TkMybatis插件

    前提: 基于SpringBoot项目,正常集成Mybatis后,为了简化sql语句的编写,甚至达到无mapper.xml文件. 在本篇总结教程,不在进行SpringBoot集成Mybatis的概述. ...

  3. Python 编程快速上手 第十四章 处理 CSV 文件和 JSON 数据

    前言 这一章分为两个部分,处理 CSV 格式的数据和处理 JSON 格式个数据. 处理 CSV 理解 csv csv 的每一行代表了电子表格中的每一行,每个逗号分开两个单元格csv 的内容全部为文本, ...

  4. vue.js面试题整理

    Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...

  5. S-Nim HDU - 1536

    #include<iostream> #include<cstdio> #include<cstring> #include<vector> using ...

  6. fiddler 显示server ip

    Fiddler显示服务器ip地址列(方便查看host是否生效) 2016年08月31日 15:40:10 阅读数:5801 1.点击菜单栏rules——customize rules... 2.ctr ...

  7. Vue之vue自动化工具快速搭建单页项目目录

    1 生成项目目录 使用vue自动化工具可以快速搭建单页应用项目目录. 该工具为现代化的前端开发工作流提供了开箱即用的构建配置.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生产环境的构 ...

  8. Plus One leetcode java

    问题描述: Given a non-negative number represented as an array of digits, plus one to the number. The dig ...

  9. SWUST OJ(955)

    单链表上查找算法的实现 #include <stdio.h> #include <stdlib.h> typedef struct LinkNode //单链表节点结构的定义 ...

  10. 有一个问题关于stl函数中的算法问题

    是不是stl中的算法函数中参数只要是和函数相关的就是函数对象和谓词?