Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式
我看到有的數(shù)據(jù)庫是一萬條數(shù)據(jù)和八萬條數(shù)據(jù)還有十幾萬條,幾百萬的數(shù)據(jù),然后我就想拿這些數(shù)據(jù)測試一下,發(fā)現(xiàn)如果用java和數(shù)據(jù)庫查詢就連一萬多條的數(shù)據(jù)查詢出來就要10s左右,感覺太慢了。然后網(wǎng)上都說各種加索引,加索引貌似是有查詢條件時在某個字段加索引比較快一些,但是畢竟是人家的庫不能瞎動,再者說了,數(shù)據(jù)量偏大一點的,條件加上也還有好多數(shù)據(jù)怎么辦,我想到了多線程的方式,話不多說,開始弄
多線程有好幾種方式,今天說的方式比較好,實現(xiàn)Callable<> 這種方式能返回查詢的數(shù)據(jù),加上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;//查詢條件 根據(jù)條件來定義該類的屬性
private int bindex;//當前頁數(shù)
private int num;//每頁查詢多少條
private String table;//要查詢的表名,也可以寫死,也可以從前面?zhèn)?
private List page;//每次分頁查出來的數(shù)據(jù)
public ThredQuery(int bindex,int num,String table) {
this.bindex=bindex;
this.num=num;
this.table=table;
//分頁查詢數(shù)據(jù)庫數(shù)據(jù)
page=sqlHadle.queryTest11(bindex,num,table);
}
@Override
public List call() throws Exception {
//返回數(shù)據(jù)給Future
return page;
}
} 調(diào)用類:
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<>();//返回結(jié)果
//查詢數(shù)據(jù)庫總數(shù)量
int count = sqlHadle.count(table);
int num = 8000;//一次查詢多少條
//需要查詢的次數(shù)
int times = count / num;
if (count % num != 0) {
times = times + 1;
}
//開始頁數(shù) 連接的是orcle的數(shù)據(jù)庫 封裝的分頁方式 我的是從1開始
int bindex = 1;
//Callable用于產(chǎn)生結(jié)果
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用于獲取結(jié)果
List<Future<List>> futures=executorService.invokeAll(tasks);
//處理線程返回結(jié)果
if(futures!=null&&futures.size()>0){
for (Future<List> future:futures){
result.addAll(future.get());
}
}
executorService.shutdown();//關(guān)閉線程池
long end = System.currentTimeMillis();
System.out.println("線程查詢數(shù)據(jù)用時:"+(end-start)+"ms");
return result;
}
}19600多條數(shù)據(jù)3秒內(nèi)查詢完,對于之前10m查詢完畢,已經(jīng)提高很多的效率了

80000多條數(shù)據(jù)7m就完成了

830305萬的數(shù)據(jù)需要40m ,哈哈哈,也算差不多一百萬的數(shù)據(jù)了,最主要的是沒有卡死,好像不經(jīng)過處理很容易卡死

5184121萬的數(shù)據(jù)報GC了,那就演示到這吧,五百萬的數(shù)據(jù)實在不適合這樣查
最主要的是,你的數(shù)據(jù)量大的話要相應的更改調(diào)用方法里的 num,一次性多查點,效率會高很多
到此這篇關(guān)于java用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式的文章就介紹到這了,更多相關(guān)java多線程查詢大量數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java通過Callable實現(xiàn)多線程
- Java多線程中Callable和Future的解讀
- Java中的Callable實現(xiàn)多線程詳解
- Java使用Callable接口實現(xiàn)多線程的實例代碼
- Java多線程實現(xiàn)之Callable詳解
- Java中Runnable和Callable分別什么時候使用
- Java中Runnable與Callable接口的區(qū)別詳解
- 詳解Java中Callable和Future的區(qū)別
- Java使用Runnable和Callable實現(xiàn)多線程的區(qū)別詳解
- java面試常問的Runnable和Callable的區(qū)別
- Java并發(fā)教程之Callable和Future接口詳解
- Java中callable的實現(xiàn)原理
相關(guān)文章
SpringCloud基于RestTemplate微服務項目案例解析
這篇文章主要介紹了SpringCloud基于RestTemplate微服務項目案例,在寫SpringCloud搭建微服務之前,先搭建一個不通過springcloud只通過SpringBoot和Mybatis進行模塊之間通訊,通過一個案例給大家詳細說明,需要的朋友可以參考下2022-05-05
淺析SpringBoot微服務中異步調(diào)用數(shù)據(jù)提交數(shù)據(jù)庫的問題
這篇文章主要介紹了SpringBoot微服務中異步調(diào)用數(shù)據(jù)提交數(shù)據(jù)庫的問題,今天本文涉及到的知識點不難,都是很簡單的crud操作,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
如何取消IDEA中的項目和Git倉庫的關(guān)聯(lián)
這篇文章介紹了一種取消已經(jīng)開啟代碼控制的項目與Git倉庫關(guān)聯(lián)的簡單方法,首先,在IntelliJ IDEA中打開項目,刪除.idea目錄下的vcs.xml文件,這樣IDE界面上的Git圖標就會消失,接下來,打開項目所在位置,通過文件管理器啟用“顯示隱藏的項目”選項2024-10-10
IDEA配置Tomcat后,控制臺tomcat?catalina?log出現(xiàn)亂碼問題
本文介紹了如何通過設(shè)置Tomcat和IDEA的編碼格式來解決編碼問題,首先嘗試修改Tomcat的logging.properties文件中的編碼設(shè)置,如果未解決問題,則調(diào)整IDEA的編碼設(shè)置,通過修改vmoptions文件來全局設(shè)置IDEA的編碼格式,作者分享了個人成功解決問題的方法和步驟,供其他開發(fā)者參考2024-09-09
AsyncHttpClient的TimeoutTimerTask連接池異步超時
這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式
這篇文章主要介紹了線程池之jdk1.8 Executors創(chuàng)建線程池的幾種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
詳解springboot中redis的使用和分布式session共享問題
這篇文章主要介紹了詳解springboot中redis的使用和分布式session共享問題,詳細的介紹了解決分布式系統(tǒng)的session如何共享問題,有興趣的可以了解一下2017-11-11

