多线程处理慢sql查询小笔记~
多线程处理慢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查询小笔记~的更多相关文章
- SQL查询(笔记2——实体查询)
SQL查询(笔记2——实体查询) 二.实体查询 如果查询返回了某个数据表的全部数据列,且该数据表有对应的持久化类映射,我们就把查询结果转换成实体查询.将查询结果转换成实体,可以使用SQLQuery提供 ...
- SQL查询小案例
这是一篇自学MySQL的小案例,下面是部分数据信息:goods表 1.查询cate_name为‘超级本’的商品名称.价格 SELECT `name`, priceFROM goodsWHERE cat ...
- SQL 学习小笔记
1.FOUND_ROWS() 题目: ,; 在上边sql中使用什么选项可以使 SELECT FOUND_ROWS()忽略LIMIT子句,返回总数? *答案* : SQL_CALC_FOUND_ROWS ...
- SQL脚本小笔记
--表添加字段.说明--- --脚本 alter table 表名 ADD 字段名 FLOAT(类型) NOT NULL Default 0(默认值) EXECUTE sp_addextendedpr ...
- MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 2) --日志系统,一条SQL查询语句如何执行 MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关.上一篇中记录了一 ...
- MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行
最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...
- SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
- spring MVC +freemarker + easyui 实现sql查询和执行小工具总结
项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...
- SQL查询条件生成小工具
最近运维数据,经常遇到需要在sql条件中个In('',''....)个字符串的情况,于是在网上找了个小工具改造一下,先用着: 效果如图: using System; using System.Coll ...
随机推荐
- 子序列的按位或 Bitwise ORs of Subarrays
2018-09-23 19:05:20 问题描述: 问题求解: 显然的是暴力的遍历所有的区间是不可取的,因为这样的时间复杂度为n^2级别的,对于规模在50000左右的输入会TLE. 然而,最后的解答也 ...
- JS获取当前日期方法
Date.prototype.format = function (format) { var args = { "M+": this.getMonth() + 1, " ...
- 使用Vue建立一个在线商店
git代码:https://github.com/chentianwei411/vue-router-demo.git 使用Vue-CLI3 webpack, ESLInt, Vuex, vue-ro ...
- 维护满足max(+ or -)min<=k的区间
这是一种经典的单调栈+线段树的维护方法. 从左到右枚举右端点. 线段树维护每一个左端点的max(+ or -)min的值. 每次右端点移动的时候,把a[i]加入单调栈. 每弹栈一次,便在线段树上把对应 ...
- P3721 [AH2017/HNOI2017]单旋
题目:https://www.luogu.org/problemnew/show/P3721 手玩一下即可AC此题. 结论:插入x后,x要么会成为x的前驱的右儿子,要么成为x的后继的左儿子,这取决于它 ...
- Linux中磁盘mbr分区——实践篇
Linux中磁盘mbr分区——实践篇 fdisk命令 语法 fdisk(选项)(参数) 选项 -b <分区大小> 指定每个分区的大小 -l 列出分区表信息 -v 显示版本信息 参数 设备文 ...
- spring boot(十七)上传文件
上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9. ...
- 4月24 php基础及函数的应用
PHP是一种被广泛认可应用,运行在服务端的脚本语言,PHP需要安转PHP应用程序服务器去解释执行,是用来协助Web服务器工作的编程语言,因此所写的任何代码只有在www文件下的才能实施预览.PHP是一种 ...
- 【Java】【3】BeanUtils.copyProperties();将一个实体类的值复制到另外一个实体类
正文: a,b为对象 BeanUtils.copyProperties(a, b); 1,BeanUtils是org.springframework.beans.BeanUtils, a拷贝到b 2 ...
- php开启redis
看下自己phpinfo的信息 php 5.5以下的都有这些文件 到这个地方下载所需要的文件:https://github.com/nicolasff/phpredis/downloads 下载解压 ...