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; } }
調用類:
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<>();//返回結果 //查詢數(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)生結果 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("線程查詢數(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ù)量大的話要相應的更改調用方法里的 num,一次性多查點,效率會高很多
到此這篇關于java用多線程批次查詢大量數(shù)據(jù)(Callable返回數(shù)據(jù))方式的文章就介紹到這了,更多相關java多線程查詢大量數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 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)原理
相關文章
spring中ApplicationListener的使用小結
ApplicationListener是spring提供的一個監(jiān)聽器,本文主要介紹了spring中ApplicationListener的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07Scala實現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼
這篇文章主要介紹了Scala實現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06