多线程处理慢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. nRF52832的SAADC

    SAADC部分思维导图 1ADC原理 1.1主要特点 1)8/10/12分辨率,使用过采样可达到14位分辨率 2)多达8个通道 单端输入时使用1个通道,2个通道可组成差分输入 单端和差分输入时均可配置 ...

  2. [C#]获取连接MySql数据库及常用的CRUD操作

    测试如下: 首先添加引用:MySql.Data.dll 链接:http://pan.baidu.com/s/1dEQgLpf 密码:bnyu *将链接数据库的信息放入配置文件中(app.config) ...

  3. Superclass和Constructor Chaining

    A subclass inherits accessible date fields and methods from its superclass. Does it inherit construc ...

  4. asp.net网站服务器搭建之从零开始

    asp.net网站服务器搭建之从零开始 一 IIS(Internet Information Services)安装:  1.选择"控制面板".  2.点"添加或删除程序 ...

  5. android -------- WIFI 详解

    今天简单的来聊一下安卓开发中的Wifi,一些常用的基础,主要分为两部分: 1:WiFi的信息 2:WiFi的搜索和连接 现在app大多都需要从网络上获得数据.所以访问网络是在所难免.但是在访问网络之前 ...

  6. python面向对象之 类的关系

    内容梗概: 1. 依赖关系 2. 关联关系, 组合关系, 聚合关系 3. 继承关系, self到底是什什么鬼? 4. 类中的特殊成员 1. 依赖关系def:在方法中给方法传递一个对象. 此时类与类之间 ...

  7. 通过selenium控制浏览器滚动条

    目的:通过selenium控制浏览器滚动条 原理:通过 driver.execute_script()执行js代码,达到目的 driver.execute_script("window.sc ...

  8. 非常不错的地区三级联动,js简单易懂。封装起来了

    首先需要引入area.js,然后配置并初始化插件: 例: <!-- 绑定银行卡开始 --> <script src="js/area.js"></sc ...

  9. 详解Oracle数据字典

    Oracle通过数据字典来管理和展现数据库信息,数据字典通常储存数据库的元数据,是数据库的“数据库”.通常说的数据字典由4部分组成:内部RDBMS(X$)表.数据字典表.动态性能视图(V$)和(静态) ...

  10. Spring注解之BeanPostProcessor与InitializingBean

    /*** BeanPostProcessor 为每个bean实例化时提供个性化的修改,做些包装等*/ package org.springframework.beans.factory.config; ...