欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式

 更新時(shí)間:2023年11月11日 14:32:56   作者:渣渣灑淚成長(zhǎng)記  
今天給大家分享Java使用多線程批次查詢大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式,多線程有好幾種方式,今天說(shuō)的方式比較好,實(shí)現(xiàn)Callable<> 這種方式能返回查詢的數(shù)據(jù),加上Future異步獲取方式,查詢效率大大加快,感興趣的朋友一起看看吧

我看到有的數(shù)據(jù)庫(kù)是一萬(wàn)條數(shù)據(jù)和八萬(wàn)條數(shù)據(jù)還有十幾萬(wàn)條,幾百萬(wàn)的數(shù)據(jù),然后我就想拿這些數(shù)據(jù)測(cè)試一下,發(fā)現(xiàn)如果用java和數(shù)據(jù)庫(kù)查詢就連一萬(wàn)多條的數(shù)據(jù)查詢出來(lái)就要10s左右,感覺太慢了。然后網(wǎng)上都說(shuō)各種加索引,加索引貌似是有查詢條件時(shí)在某個(gè)字段加索引比較快一些,但是畢竟是人家的庫(kù)不能瞎動(dòng),再者說(shuō)了,數(shù)據(jù)量偏大一點(diǎn)的,條件加上也還有好多數(shù)據(jù)怎么辦,我想到了多線程的方式,話不多說(shuō),開始弄

多線程有好幾種方式,今天說(shuō)的方式比較好,實(shí)現(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ù)條件來(lái)定義該類的屬性
    private int bindex;//當(dāng)前頁(yè)數(shù)
    private int num;//每頁(yè)查詢多少條
    private String table;//要查詢的表名,也可以寫死,也可以從前面?zhèn)?
    private List page;//每次分頁(yè)查出來(lái)的數(shù)據(jù)
    public  ThredQuery(int bindex,int num,String table) {
        this.bindex=bindex;
        this.num=num;
        this.table=table;
        //分頁(yè)查詢數(shù)據(jù)庫(kù)數(shù)據(jù)
        page=sqlHadle.queryTest11(bindex,num,table);
    }
    @Override
    public List call() throws Exception {
        //返回?cái)?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();//開始時(shí)間
        List<List> result = new ArrayList<>();//返回結(jié)果
        //查詢數(shù)據(jù)庫(kù)總數(shù)量
        int count = sqlHadle.count(table);
        int num = 8000;//一次查詢多少條
        //需要查詢的次數(shù)
        int times = count / num;
        if (count % num != 0) {
            times = times + 1;
        }
        //開始頁(yè)數(shù)  連接的是orcle的數(shù)據(jù)庫(kù)  封裝的分頁(yè)方式  我的是從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;
        }
        //定義固定長(zhǎng)度的線程池  防止線程過多
        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ù)用時(shí):"+(end-start)+"ms");
        return result;
    }
}

19600多條數(shù)據(jù)3秒內(nèi)查詢完,對(duì)于之前10m查詢完畢,已經(jīng)提高很多的效率了

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

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

5184121萬(wàn)的數(shù)據(jù)報(bào)GC了,那就演示到這吧,五百萬(wàn)的數(shù)據(jù)實(shí)在不適合這樣查

最主要的是,你的數(shù)據(jù)量大的話要相應(yīng)的更改調(diào)用方法里的 num,一次性多查點(diǎn),效率會(huì)高很多

到此這篇關(guān)于java用多線程批次查詢大量數(shù)據(jù)(Callable返回?cái)?shù)據(jù))方式的文章就介紹到這了,更多相關(guān)java多線程查詢大量數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)郵件發(fā)送

    java實(shí)現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • spring中ApplicationListener的使用小結(jié)

    spring中ApplicationListener的使用小結(jié)

    ApplicationListener是spring提供的一個(gè)監(jiān)聽器,本文主要介紹了spring中ApplicationListener的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • SpringBoot disruptor高性能隊(duì)列使用

    SpringBoot disruptor高性能隊(duì)列使用

    這篇文章主要介紹了SpringBoot disruptor高性能隊(duì)列使用,Disruptor是英國(guó)外匯交易公司LMAX開發(fā)的一個(gè)高性能隊(duì)列,研發(fā)的初衷是解決內(nèi)存隊(duì)列的延遲問題
    2023-02-02
  • Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼

    Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼

    這篇文章主要介紹了Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2019-06-06
  • 如何利用Java輸出鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)

    如何利用Java輸出鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)

    這篇文章主要給大家介紹了關(guān)于如何利用Java輸出鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • eclipse自動(dòng)提示和自動(dòng)補(bǔ)全功能實(shí)現(xiàn)方法

    eclipse自動(dòng)提示和自動(dòng)補(bǔ)全功能實(shí)現(xiàn)方法

    這篇文章主要介紹了eclipse自動(dòng)提示和自動(dòng)補(bǔ)全的相關(guān)內(nèi)容,文中向大家分享了二者的實(shí)現(xiàn)方法代碼,需要的朋友可以了解下。
    2017-09-09
  • 為什么SpringMVC中請(qǐng)求的body不支持多次讀取

    為什么SpringMVC中請(qǐng)求的body不支持多次讀取

    這篇文章主要介紹了為什么SpringMVC中請(qǐng)求的body不支持多次讀取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • spring的異步執(zhí)行使用與源碼詳解

    spring的異步執(zhí)行使用與源碼詳解

    這篇文章主要介紹了spring的異步執(zhí)行使用與源碼詳解,Spring中通過在方法上設(shè)置@Async注解,可使得方法被異步調(diào)用,需要的朋友可以參考下
    2023-05-05
  • java通過方向鍵控制小球移動(dòng)的小游戲

    java通過方向鍵控制小球移動(dòng)的小游戲

    這篇文章主要為大家詳細(xì)介紹了java通過方向鍵控制小球移動(dòng)的小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • RateLimit-使用guava來(lái)做接口限流代碼示例

    RateLimit-使用guava來(lái)做接口限流代碼示例

    這篇文章主要介紹了RateLimit-使用guava來(lái)做接口限流代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論