Java使用多线程批次查询大量数据(Callable返回数据)方式
我看到有的数据库是一万条数据和八万条数据还有十几万条,几百万的数据,然后我就想拿这些数据测试一下,发现如果用java和数据库查询就连一万多条的数据查询出来就要10s左右,感觉太慢了。然后网上都说各种加索引,加索引貌似是有查询条件时在某个字段加索引比较快一些,但是毕竟是人家的库不能瞎动,再者说了,数据量偏大一点的,条件加上也还有好多数据怎么办,我想到了多线程的方式,话不多说,开始弄
多线程有好几种方式,今天说的方式比较好,实现Callable<> 这种方式能返回查询的数据,加上Future异步获取方式,查询效率大大加快
线程类:
package com.ThreadPoolHadel;
import com.sqlSource.SqlHadle;
import java.util.List;
import java.util.concurrent.Callable;
/**
* Created by df on 2018/9/20.
*/
public class ThredQuery implements Callable<List> {
SqlHadle sqlHadle=new SqlHadle();
private String search;//查询条件 根据条件来定义该类的属性
private int bindex;//当前页数
private int num;//每页查询多少条
private String table;//要查询的表名,也可以写死,也可以从前面传
private List page;//每次分页查出来的数据
public ThredQuery(int bindex,int num,String table) {
this.bindex=bindex;
this.num=num;
this.table=table;
//分页查询数据库数据
page=sqlHadle.queryTest11(bindex,num,table);
}
@Override
public List call() throws Exception {
//返回数据给Future
return page;
}
} 调用类:
package com.service;
import com.ThreadPoolHadel.ThredQuery;
import com.sqlSource.SqlHadle;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* Created by df on 2018/9/20.
*/
@Service
public class TheardQueryService {
SqlHadle sqlHadle=new SqlHadle();
public List<List> getMaxResult(String table) throws InterruptedException, ExecutionException {
long start = System.currentTimeMillis();//开始时间
List<List> result = new ArrayList<>();//返回结果
//查询数据库总数量
int count = sqlHadle.count(table);
int num = 8000;//一次查询多少条
//需要查询的次数
int times = count / num;
if (count % num != 0) {
times = times + 1;
}
//开始页数 连接的是orcle的数据库 封装的分页方式 我的是从1开始
int bindex = 1;
//Callable用于产生结果
List<Callable<List>> tasks = new ArrayList<>();
for (int i = 0; i < times; i++) {
Callable<List> qfe = new ThredQuery(bindex, num, table);
tasks.add(qfe);
bindex += bindex;
}
//定义固定长度的线程池 防止线程过多
ExecutorService executorService = Executors.newFixedThreadPool(15);
//Future用于获取结果
List<Future<List>> futures=executorService.invokeAll(tasks);
//处理线程返回结果
if(futures!=null&&futures.size()>0){
for (Future<List> future:futures){
result.addAll(future.get());
}
}
executorService.shutdown();//关闭线程池
long end = System.currentTimeMillis();
System.out.println("线程查询数据用时:"+(end-start)+"ms");
return result;
}
}19600多条数据3秒内查询完,对于之前10m查询完毕,已经提高很多的效率了

80000多条数据7m就完成了

830305万的数据需要40m ,哈哈哈,也算差不多一百万的数据了,最主要的是没有卡死,好像不经过处理很容易卡死

5184121万的数据报GC了,那就演示到这吧,五百万的数据实在不适合这样查
最主要的是,你的数据量大的话要相应的更改调用方法里的 num,一次性多查点,效率会高很多
到此这篇关于java用多线程批次查询大量数据(Callable返回数据)方式的文章就介绍到这了,更多相关java多线程查询大量数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- Java通过Callable实现多线程
- Java多线程中Callable和Future的解读
- Java中的Callable实现多线程详解
- Java使用Callable接口实现多线程的实例代码
- Java多线程实现之Callable详解
- Java中Runnable和Callable分别什么时候使用
- Java中Runnable与Callable接口的区别详解
- 详解Java中Callable和Future的区别
- Java使用Runnable和Callable实现多线程的区别详解
- java面试常问的Runnable和Callable的区别
- Java并发教程之Callable和Future接口详解
- Java中callable的实现原理
相关文章
SpringCloud基于RestTemplate微服务项目案例解析
这篇文章主要介绍了SpringCloud基于RestTemplate微服务项目案例,在写SpringCloud搭建微服务之前,先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间通讯,通过一个案例给大家详细说明,需要的朋友可以参考下2022-05-05
浅析SpringBoot微服务中异步调用数据提交数据库的问题
这篇文章主要介绍了SpringBoot微服务中异步调用数据提交数据库的问题,今天本文涉及到的知识点不难,都是很简单的crud操作,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下2022-07-07
IDEA配置Tomcat后,控制台tomcat catalina log出现乱码问题
本文介绍了如何通过设置Tomcat和IDEA的编码格式来解决编码问题,首先尝试修改Tomcat的logging.properties文件中的编码设置,如果未解决问题,则调整IDEA的编码设置,通过修改vmoptions文件来全局设置IDEA的编码格式,作者分享了个人成功解决问题的方法和步骤,供其他开发者参考2024-09-09
AsyncHttpClient的TimeoutTimerTask连接池异步超时
这篇文章主要为大家介绍了AsyncHttpClient的TimeoutTimerTask连接池异步超时源码流程解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12
线程池之jdk1.8 Executors创建线程池的几种方式
这篇文章主要介绍了线程池之jdk1.8 Executors创建线程池的几种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08
详解springboot中redis的使用和分布式session共享问题
这篇文章主要介绍了详解springboot中redis的使用和分布式session共享问题,详细的介绍了解决分布式系统的session如何共享问题,有兴趣的可以了解一下2017-11-11


最新评论