chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java多線程應(yīng)用程序的數(shù)據(jù)存儲庫使用改進(jìn)

汽車玩家 ? 來源:黑馬程序員 ? 作者:黑馬程序員 ? 2020-05-05 20:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

n個查詢1個參數(shù)與1個查詢n個參數(shù)

讓我們假設(shè)一個Java應(yīng)用程序執(zhí)行對關(guān)系數(shù)據(jù)庫的查詢,以在給定其唯一標(biāo)識符(id)的情況下檢索Product實體(行)。

查詢看起來像這樣:

Java多線程應(yīng)用程序的數(shù)據(jù)存儲庫使用改進(jìn)

現(xiàn)在,要檢索n種產(chǎn)品,可以通過兩種方法進(jìn)行:

對一個參數(shù)執(zhí)行n個獨(dú)立查詢:

Java多線程應(yīng)用程序的數(shù)據(jù)存儲庫使用改進(jìn)

使用IN運(yùn)算符或OR的組合,對n個參數(shù)執(zhí)行一次查詢以同時檢索n個產(chǎn)品

后者在網(wǎng)絡(luò)流量和數(shù)據(jù)庫服務(wù)器資源(CPU和磁盤)方面更為有效,因為:

到數(shù)據(jù)庫的往返次數(shù)為1,而不是n。

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

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

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

延遲批處理執(zhí)行器

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

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

并發(fā)線程數(shù)很高(每秒數(shù)十或數(shù)百)。

在這種情況下,數(shù)據(jù)庫很可能在很短的時間間隔內(nèi)多次執(zhí)行相同的查詢。

如前所述,如果將這1個參數(shù)的n個查詢替換為具有n個參數(shù)的單個等效查詢,則應(yīng)用程序?qū)⑹褂幂^少的數(shù)據(jù)庫服務(wù)器和網(wǎng)絡(luò)資源。

好消息是,可以通過以下涉及時間窗口的機(jī)制來實現(xiàn)它 :

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

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

我為自己(延遲批處理執(zhí)行器)構(gòu)建了此機(jī)制的簡單輕便的實現(xiàn),可以輕松在新的或現(xiàn)有的應(yīng)用程序中使用。它基于 Reactor庫,并且使用帶有通量的Flux緩沖發(fā)布者作為參數(shù)列表。

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

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

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

其他有趣的配置:

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

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

延遲批處理執(zhí)行器在行動

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

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

讓我們看看不帶和帶的DAO的實現(xiàn) 延遲批處理執(zhí)行器。

沒有延遲批處理執(zhí)行器

Java多線程應(yīng)用程序的數(shù)據(jù)存儲庫使用改進(jìn)

使用延遲批處理執(zhí)行器

Java多線程應(yīng)用程序的數(shù)據(jù)存儲庫使用改進(jìn)

首先,延遲批處理執(zhí)行器必須在DAO中創(chuàng)建的實例,在本例中為delayedBatchExecutorProductById。它需要以下三個參數(shù):

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

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

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

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

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

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

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

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

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

就是這樣。

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

超越數(shù)據(jù)倉庫

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

延遲批處理執(zhí)行器的改進(jìn)

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2997

    瀏覽量

    115685
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20761
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    多線程的系統(tǒng)

    ,開始多線程調(diào)度,不再返回 */ RTOSStart(); while(1);/* 程序不會執(zhí)行到這里 */ } void ISR1(void) { /* 置位標(biāo)志位 */ flag1
    發(fā)表于 12-08 07:55

    Linux多線程對比單線程的優(yōu)勢

    :「資源利用率」:通過多線程,可以更有效地利用CPU資源,特別是多核CPU?!覆⑿刑幚怼梗?b class='flag-5'>線程允許同時執(zhí)行多個任務(wù),提高程序的執(zhí)行效率?!负喕O(shè)計」:使用線程可以簡化
    發(fā)表于 12-01 06:11

    rt-thread studio 如何進(jìn)行多線程編譯?

    ,使用的是5800h+32g內(nèi)存+sn550 ssd,開啟16線程編譯時cpu的占用率也只能到30%,編譯完整個工程需要3分鐘 感覺多線程編譯設(shè)置沒有生效,有辦法提高編譯速度嗎 rtthread studio版本是 2.2.9
    發(fā)表于 10-11 09:16

    【HZ-T536開發(fā)板免費(fèi)體驗】—— linux創(chuàng)建線程

    線程與進(jìn)程 一個進(jìn)程指的是一個正在執(zhí)行的應(yīng)用程序,而線程的功能是執(zhí)行應(yīng)用程序中的某個具體任務(wù)。線程具有傳統(tǒng)
    發(fā)表于 09-01 21:31

    從底層解讀labview的TDMS高級異步寫入的工作原理

    數(shù)據(jù)采集或處理循環(huán),從而顯著提高整體應(yīng)用程序的吞吐量和響應(yīng)性。 解耦: 將數(shù)據(jù)生成邏輯(如 DAQ 循環(huán))與數(shù)據(jù)存儲邏輯(磁盤寫入)分離,
    發(fā)表于 08-14 17:05

    多線程的安全注意事項

    和模塊需要支持多線程安全,否則可能會導(dǎo)致多線程數(shù)據(jù)競爭問題,造成應(yīng)用程序異?;虮罎?。 在TaskPool或Worker的工作線程中支持使用以
    發(fā)表于 06-20 07:49

    什么是ArkTS?

    基礎(chǔ)類能力示意圖 提供異步并發(fā)和多線程并發(fā)的能力。 支持Promise和async/await等標(biāo)準(zhǔn)的JS異步并發(fā)能力。 TaskPool為應(yīng)用程序提供一個多線程的運(yùn)行環(huán)境,降
    發(fā)表于 06-17 06:24

    使用Percepio View免費(fèi)跟蹤工具分析Zephyr應(yīng)用

    Percepio View免費(fèi)跟蹤工具現(xiàn)在可以針對Zephyr應(yīng)用程序進(jìn)行跟蹤和可視化分析了。Percepio View可以幫助開發(fā)人員理解和調(diào)試Zephyr中的固定優(yōu)先級的多線程行為及復(fù)雜的線程交互。
    的頭像 發(fā)表于 05-27 15:08 ?588次閱讀
    使用Percepio View免費(fèi)跟蹤工具分析Zephyr應(yīng)用

    Java開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發(fā)者在用?

    Perforce JRebel是一款Java開發(fā)效率工具,旨在幫助java開發(fā)人員更快地編寫更好的應(yīng)用程序。JRebel可即時重新加載對代碼的修改,無需重啟或重新部署應(yīng)用程序,就能讓開
    的頭像 發(fā)表于 04-27 13:44 ?648次閱讀
    <b class='flag-5'>Java</b>開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多<b class='flag-5'>Java</b>開發(fā)者在用?

    分布式存儲數(shù)據(jù)恢復(fù)—虛擬機(jī)上hbase和hive數(shù)據(jù)庫數(shù)據(jù)恢復(fù)案例

    分布式存儲數(shù)據(jù)恢復(fù)環(huán)境: 16臺某品牌R730xd服務(wù)器節(jié)點(diǎn),每臺服務(wù)器節(jié)點(diǎn)上有數(shù)臺虛擬機(jī)。 虛擬機(jī)上部署Hbase和Hive數(shù)據(jù)庫。 分布式存儲故障:
    的頭像 發(fā)表于 04-17 11:05 ?514次閱讀

    請問如何在Python中實現(xiàn)多線程與多進(jìn)程的協(xié)作?

    () thread.join() process.join() 我的問題是:**如何合理地組合多線程和多進(jìn)程以獲得更好的性能?**特別是在I/O密集型任務(wù)和CPU密集型任務(wù)混合的情況下,如何避免性能瓶頸,確保程序的高效運(yùn)行? 希望大家能提供一些解決思路或經(jīng)驗,非常感謝!
    發(fā)表于 03-11 06:57

    請問rt-thread studio如何進(jìn)行多線程編譯?

    ,使用的是5800h+32g內(nèi)存+sn550 ssd,開啟16線程編譯時cpu的占用率也只能到30%,編譯完整個工程需要3分鐘 感覺多線程編譯設(shè)置沒有生效,有辦法提高編譯速度嗎
    發(fā)表于 02-19 08:30

    從Delphi、C++ Builder和Lazarus連接到MySQL數(shù)據(jù)庫

    平臺。 基于 MyDAC 的應(yīng)用程序可以直接連接到 MySQL 服務(wù)器或通過 MySQL 客戶端工作。MySQL 數(shù)據(jù)訪問組件旨在幫助程序員更快、更輕松地開發(fā) MySQL
    的頭像 發(fā)表于 01-20 13:47 ?1324次閱讀
    從Delphi、C++ Builder和Lazarus連接到MySQL<b class='flag-5'>數(shù)據(jù)庫</b>

    ANACONDA——關(guān)于發(fā)布數(shù)據(jù)應(yīng)用程序的新簡單方法

    我們推出了一款用于發(fā)布數(shù)據(jù)應(yīng)用程序的開創(chuàng)性解決方案:具有 Panel 應(yīng)用程序部署功能的 Anaconda Cloud Notebooks。Panel 是一種開源 Python 工具,現(xiàn)在
    的頭像 發(fā)表于 01-17 11:39 ?644次閱讀
    ANACONDA——關(guān)于發(fā)布<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>應(yīng)用程序</b>的新簡單方法

    SSM框架在Java開發(fā)中的應(yīng)用 如何使用SSM進(jìn)行web開發(fā)

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web開發(fā)中常用的技術(shù)棧。它通過分層架構(gòu),實現(xiàn)了視圖、控制、業(yè)務(wù)邏輯和數(shù)據(jù)訪問的分離,提高了代碼的可維護(hù)性和可擴(kuò)展性
    的頭像 發(fā)表于 12-16 17:28 ?2132次閱讀