色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java多線程應用程序的數據存儲庫使用改進

汽車玩家 ? 來源:黑馬程序員 ? 作者:黑馬程序員 ? 2020-05-05 20:46 ? 次閱讀

當執行的查詢數量很大時,數據存儲庫通常是高要求系統的瓶頸。延遲批處理執行器(DelayedBatchExecutor)是一個組件,可通過在Java多線程應用程序中對所需查詢進行批處理來減少所需查詢的數量。

n個查詢1個參數與1個查詢n個參數

讓我們假設一個Java應用程序執行對關系數據庫的查詢,以在給定其唯一標識符(id)的情況下檢索Product實體(行)。

查詢看起來像這樣:

Java多線程應用程序的數據存儲庫使用改進

現在,要檢索n種產品,可以通過兩種方法進行:

對一個參數執行n個獨立查詢:

Java多線程應用程序的數據存儲庫使用改進

使用IN運算符或OR的組合,對n個參數執行一次查詢以同時檢索n個產品

后者在網絡流量和數據庫服務器資源(CPU和磁盤)方面更為有效,因為:

到數據庫的往返次數為1,而不是n。

數據庫引擎針對n個參數優化了其數據遍歷過程,即,它可能只需要對每個表進行一次掃描而不是n次掃描。

這不僅適用于SELECT操作,而且適用于其他操作,例如INSERT,UPDATE和DELETE,實際上,JDBC API包括這些操作的批處理操作。

這同樣適用于NoSQL存儲庫,其中大多數都顯式提供BULK操作。

延遲批處理執行器

需要從數據庫檢索數據的Java應用程序(如REST微服務或異步消息處理器)通常實現為多線程應用程序(* 1),其中:

每個線程在其執行的某個時刻執行相同的查詢(每個查詢具有不同的參數)。

并發線程數很高(每秒數十或數百)。

在這種情況下,數據庫很可能在很短的時間間隔內多次執行相同的查詢。

如前所述,如果將這1個參數的n個查詢替換為具有n個參數的單個等效查詢,則應用程序將使用較少的數據庫服務器和網絡資源。

好消息是,可以通過以下涉及時間窗口的機制來實現它 :

第一個嘗試執行查詢的線程將打開一個時間窗口,因此其參數存儲在列表中,并且該線程已暫停。在時間窗口內執行相同查詢的其余線程會將其參數添加到列表中,并且也會被暫停。此時,尚未在數據庫上執行任何查詢。

時間窗口結束或列表已滿(預先定義了最大容量限制)后,便會使用列表中存儲的所有參數執行單個查詢。最后,一旦數據庫提供了該查詢的結果,每個線程將接收其相應的結果,并且所有線程將自動恢復。

我為自己(延遲批處理執行器)構建了此機制的簡單輕便的實現,可以輕松在新的或現有的應用程序中使用。它基于 Reactor庫,并且使用帶有通量的Flux緩沖發布者作為參數列表。

使用延遲批處理執行器的吞吐量和延遲分析

讓我們假設一個針對產品的REST微服務,它公開了一個端點,用于從給定的數據庫中檢索產品數據 productId。如果不使用 延遲批處理執行器,則說到端點每秒有200次命中,則數據庫每秒執行200個查詢。如果端點使用的 時間窗口延遲批處理執行器配置為50毫秒,最大容量 = 10個參數,則數據庫每秒僅執行20個查詢,每個參數10個參數,但代價是最多在50毫秒內增加延遲(* 2)對于每個線程執行。

換句話說,為了將等待時間增加50 ms(* 2),在保持系統整體吞吐量的同時,數據庫每秒收到的查詢減少了10倍。

其他有趣的配置:

窗口時間 = 100毫秒,最大容量 = 20個參數→20個參數的10個查詢(查詢減少20倍)

窗口時間 = 500毫秒,最大容量 = 100個參數→2個查詢,共100個參數(查詢減少100倍)

延遲批處理執行器在行動

深入研究Product微服務示例,假設對于每個傳入的HTTP請求,微服務的控制器都要求我們檢索提供其ID的Product(Java Bean),因此它將調用該方法:

public Product getProductById(Integer productId) DAO組件的ProductDAO。

讓我們看看不帶和帶的DAO的實現 延遲批處理執行器。

沒有延遲批處理執行器

Java多線程應用程序的數據存儲庫使用改進

使用延遲批處理執行器

Java多線程應用程序的數據存儲庫使用改進

首先,延遲批處理執行器必須在DAO中創建的實例,在本例中為delayedBatchExecutorProductById。它需要以下三個參數:

時間窗口(在此示例中為50毫秒)

參數列表的最大容量(在此示例中為10個參數)

將使用參數列表調用的方法(我們將在后面詳細介紹)。在此示例中,方法是retrieveProductsByIds

注意:我們將在后面看到為什么延遲批處理執行器的標識(delayedBatchExecutor ProductById)是該類的實例DelayedBatchExecutor2

其次,DAO方法public Product getProductById(Integer productId)已經過重構,可以簡單地調用實例的execute方法,僅此delayedBatchExecutor ProductById而已。所有的“魔術”都是由DelayedBatchExecutor。

之所以delayedBatchExecutor ProductById是的實例,DelayedBatchExecutor2是因為其execute方法返回一個Product實例并接收一個Integer實例作為其參數。因此,我們有: DelayedBatchExecutor2.

如果execute方法需要接收兩個參數(例如an Integer和a String)并返回的實例Product,則定義為DelayedBatchExecutor3 ,依此類推。

最后,該 retrieveProductsByIds方法必須返回a List并接收a List作為參數。

如果我們使用DelayedBatchExecutor3,則retrieveProductsByIds必須是List retrieveProductsByIds(List productIdsList, List stringList)

就是這樣。

一旦運行,執行控制器邏輯的并發線程將getProductById(Integer id)在某個時候調用該方法,并且該方法將返回相應的乘積。他們不會知道他們實際上可能已經被暫停并恢復了延遲批處理執行器.

超越數據倉庫

盡管本文與數據存儲庫有關, 延遲批處理執行器 但是可以在其他上下文中使用,例如,在對REST微服務的請求中。同樣,用一個參數啟動n個GET請求要比使用n個參數啟動1個GET要昂貴得多。

延遲批處理執行器的改進

我創建 延遲批處理執行器并使用了一段時間,以有效地處理由個人項目中的并發線程啟動的多個查詢的執行。我相信它對其他人也可能有用,所以我決定將其公開。

話雖如此,仍有很大的改進空間并可以擴展所提供的功能 延遲批處理執行器。最有趣的是能夠根據執行的特定條件動態更改參數 延遲批處理執行器(窗口時間和最大容量),以最大程度地減少等待時間,同時利用具有n個參數的查詢。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19675
收藏 人收藏

    評論

    相關推薦

    socket 多線程編程實現方法

    是指在同一個進程中運行多個線程,每個線程可以獨立執行任務。線程共享進程的資源,如內存空間和文件句柄,但每個線程有自己的程序計數器、寄存器集合
    的頭像 發表于 11-12 14:16 ?339次閱讀

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程池與進程池來提高并發執行效率。
    的頭像 發表于 10-23 11:48 ?392次閱讀
    Python中<b class='flag-5'>多線程</b>和多進程的區別

    華納云:java web和java有什么區別java web和java有什么區別

    的平臺,Java可以用于開發桌面應用程序、移動應用程序、企業級應用程序等。 – Java Web是Jav
    的頭像 發表于 07-16 13:35 ?785次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    多線程設計模式到對 CompletableFuture 的應用

    最近在開發 延保服務 頻道頁時,為了提高查詢效率,使用到了多線程技術。為了對多線程方案設計有更加充分的了解,在業余時間讀完了《圖解 Java 多線程設計模式》這本書,覺得收獲良多。本篇
    的頭像 發表于 06-26 14:18 ?343次閱讀
    從<b class='flag-5'>多線程</b>設計模式到對 CompletableFuture 的應用

    bootloader開多線程做引導程序,跳app初始化后直接進hardfualt,為什么?

    如標題,想做一個遠程升級的項目,bootloader引導區域和app都是開多線程跑的,就是自己寫了個小的任務調度器,沒什么功能主要是想讓程序快速的響應,延時不會對其他程序造成堵塞,程序
    發表于 04-18 06:07

    鴻蒙OS開發實例:【ArkTS類多線程CPU密集型任務TaskPool】

    CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數據分析等。 基于多線程
    的頭像 發表于 04-01 22:25 ?832次閱讀
    鴻蒙OS開發實例:【ArkTS類<b class='flag-5'>庫</b><b class='flag-5'>多線程</b>CPU密集型任務TaskPool】

    鴻蒙原生應用開發-ArkTS語言基礎類多線程并發概述

    長度,可以存儲任何類型的數據,包括數字、字符串等。 共享對象傳輸指SharedArrayBuffer支持在多線程之間傳遞,傳遞之后的SharedArrayBuffer對象和原始
    發表于 03-28 14:35

    鴻蒙APP開發:【ArkTS類多線程】TaskPool和Worker的對比

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這些任務阻塞主線程,從而最大化系統的利用率,降低整體資源消耗,并提高系統的整體性能。
    的頭像 發表于 03-26 22:09 ?609次閱讀
    鴻蒙APP開發:【ArkTS類<b class='flag-5'>庫</b><b class='flag-5'>多線程</b>】TaskPool和Worker的對比

    鴻蒙原生應用開發-ArkTS語言基礎類多線程TaskPool和Worker的對比(一)

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這些任務阻塞主線程,從而最大化系統的利用率,降低整體資源消耗
    發表于 03-25 14:11

    鴻蒙原生應用開發-ArkTS語言基礎類多線程并發概述

    長度,可以存儲任何類型的數據,包括數字、字符串等。 共享對象傳輸指SharedArrayBuffer支持在多線程之間傳遞,傳遞之后的SharedArrayBuffer對象和原始
    發表于 03-22 15:40

    鴻蒙原生應用開發-ArkTS語言基礎類多線程CPU密集型任務TaskPool

    CPU密集型任務是指需要占用系統資源處理大量計算能力的任務,需要長時間運行,這段時間會阻塞線程其它事件的處理,不適宜放在主線程進行。例如圖像處理、視頻編碼、數據分析等。 基于多線程并發
    發表于 03-19 14:14

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同
    的頭像 發表于 03-14 16:55 ?688次閱讀

    鴻蒙原生應用開發-ArkTS語言基礎類概述

    的JS異步并發能力。 TaskPool為應用程序提供一個多線程的運行環境,降低整體資源的消耗、提高系統的整體性能,開發者無需關心線程實例的生命周期。 Worker支持多線程并發,支持W
    發表于 03-05 15:42

    AT socket可以多線程調用嗎?

    請問AT socket 可以多線程調用嗎? 有互鎖機制嗎,還是要自己做互鎖。
    發表于 03-01 08:22

    ArkTS語言基礎類-解析

    Promise和async/await等標準的JS異步并發能力。 TaskPool為應用程序提供一個多線程的運行環境,降低整體資源的消耗、提高系統的整體性能,開發者無需關心線程實例的生命周期。 Worker支持
    發表于 02-20 16:44
    主站蜘蛛池模板: 亚洲精品卡2卡3卡4卡5卡区| 国产成人a在一区线观看高清| 亚洲大片免费| 色屁屁影院| 热久久2018亚洲欧美| 老师给美女同学开嫩苞| 国产精品av| 高清国语自产拍免费| 芭乐草莓樱桃丝瓜18岁大全| 中文字幕福利视频在线一区| 亚洲欧美人成视频在线| 色偷偷91综合久久噜噜| 男人把女人桶到高潮嗷嗷叫| 久久机热免费视频| 韩国女人高潮嗷嗷叫视频| 粉嫩无套白浆第一次jk| 成人网络电视破解版| 吃奶啃奶玩乳漫画| 高清 国产 在线 亚洲| 成人网站国产在线视频内射视频| ca88亚洲城娱乐| 北岛玲手机在线观看视频观看 | 韩国成人理伦片免费播放| 国产啪视频在线播放观看| 国产亚洲精品久久无码98| 国产真实女人一级毛片| 好爽别插了无码视频| 极品少妇高潮啪啪AV无码吴梦梦 | 99热这里只就有精品22| 97精品国产高清在线看入口| av影音先锋天堂网| 高清欧美一区二区三区| 国产欧美一区二区三区免费 | 91系列在线观看免费| a视频免费在线| 被滋润的艳妇疯狂呻吟白洁老七| 97国产成人精品视频| 芭乐视频免费资源在线观看| 公开超碰在线视频| 国产亚洲精品久久久久久线投注| 精品免费久久久久久成人影院|