亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

事務(wù)與多線程的坑及調(diào)優(yōu)Tips

wums / 3627人閱讀

摘要:起因及介紹在處理原始對(duì)賬文件的時(shí)候,我將數(shù)據(jù)歸類后批量存入相應(yīng)的表中。結(jié)論事務(wù)只能管著開啟事務(wù)的線程,其他子線程出了問題都感知不到,所以在多線程環(huán)境操作要慎重。高頻容易搞死服務(wù)器,低頻會(huì)阻塞自身程序。重試次數(shù)和超時(shí)時(shí)間根據(jù)業(yè)務(wù)情況設(shè)置。

起因及介紹

在處理原始對(duì)賬文件的時(shí)候,我將數(shù)據(jù)歸類后批量存入相應(yīng)的表中。在持久化的時(shí)候,用了parallelStream(),想著同時(shí)存入很多表這樣可以提高效率。

@Override
@Transactional
public boolean handleTask(AccEbankAlEveBill[] task, String ownSign) throws Exception {
    Arrays.stream(task).parallel().map(AccEbankBill::convert).collect(Collectors.groupingBy(AccEbankBill::getTradeType)).entrySet()
    // 這里出了問題
    .parallelStream().forEach(item -> {
        switch (EbankAleveTradeTypeEnum.valueOf(item.getKey())) {
        // 提現(xiàn)...
        // 充值
        case RECHARGE:
            accEbankRechargeBillDao.batchSave(item.getValue());
            break;

        // 利息
        case INTEREST:
            accEbankInterestBillDao.batchSave(item.getValue());
            break;
        case OTHERS:
            accEBankAleveOthersBillDao.batchSave(item.getValue());
            break;
        }
    });

    // DB update
    return true;
}
問題分析

上面代碼中將對(duì)賬數(shù)據(jù)按類型歸類后,得到一個(gè)Map>,key為類型,value為數(shù)據(jù)??紤]到數(shù)據(jù)類型有很多種,然后使用了parallelStream()。在最近的一次自測(cè)中,由于開發(fā)數(shù)據(jù)庫網(wǎng)絡(luò)問題,造成事務(wù)處理超時(shí),但發(fā)現(xiàn)數(shù)據(jù)沒有回滾!

開始沿著數(shù)據(jù)庫超時(shí)中斷機(jī)制的思路找問題,花了比較多的時(shí)間在分析是數(shù)據(jù)庫端觸發(fā)了中斷,還是應(yīng)用層主動(dòng)中斷,以及兩者對(duì)是否回滾有啥區(qū)別。。最后發(fā)現(xiàn)這些都不是原因

第二天一早突然想到這里的parallelStream()可能是罪魁禍?zhǔn)?,因?yàn)樗_啟了多線程(多線程往往有問題),本機(jī)環(huán)境一共有4個(gè)worker在處理(包含主線程),但是超時(shí)導(dǎo)致的org.springframework.transaction.TransactionTimedOutException錯(cuò)誤是發(fā)生在主線程內(nèi)的,那肯定只有主線程回滾了。后經(jīng)測(cè)試證實(shí)。

總結(jié)

解決方法就是去除parallelStream(),簡(jiǎn)簡(jiǎn)單單的使用Map的forEach就好了。

結(jié)論:事務(wù)只能管著開啟事務(wù)的線程,其他子線程出了問題都感知不到,所以在多線程環(huán)境操作DB要慎重。普通的多線程很容易發(fā)覺,但parallelStream是也是,切記

調(diào)優(yōu)Tips

1. 線程池的大小

線程池的大小 = 處理器的核的數(shù)目 期望的CPU利用率 (1 + W/C)

其中:

CPU利用率介于0和1之間

W/C是等待時(shí)間與計(jì)算時(shí)間的比率

源自《Java并發(fā)編程實(shí)戰(zhàn)》Brian Goetz的建議

2. 文件下載

HTTP(S)用apache httpclient可實(shí)現(xiàn)鏈接池和斷點(diǎn)續(xù)傳, FTP可使用Apache Commons Net API。
重試間隔設(shè)置為5~10分鐘較合適。高頻容易搞死服務(wù)器,低頻會(huì)阻塞自身程序。
重試次數(shù)和超時(shí)時(shí)間根據(jù)業(yè)務(wù)情況設(shè)置。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70709.html

相關(guān)文章

  • 學(xué)Java編程需要注意的地方

    摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。   學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...

    leanxi 評(píng)論0 收藏0
  • 你和阿里資深架構(gòu)師之間,差的不僅僅是年齡(進(jìn)階必看)

    摘要:導(dǎo)讀閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己進(jìn)行查漏補(bǔ)缺,覺得本文對(duì)你有幫助的話,可以點(diǎn)贊關(guān)注一下。目錄一基礎(chǔ)篇二進(jìn)階篇三高級(jí)篇四架構(gòu)篇五擴(kuò) 導(dǎo)讀:閱讀本文需要有足夠的時(shí)間,筆者會(huì)由淺到深帶你一步一步了解一個(gè)資深架構(gòu)師所要掌握的各類知識(shí)點(diǎn),你也可以按照文章中所列的知識(shí)體系對(duì)比自身,對(duì)自己...

    huaixiaoz 評(píng)論0 收藏0
  • ios局部滾動(dòng)坑及解決方案

    摘要:起因最近幾天在寫一個(gè)滾動(dòng)加載更多數(shù)據(jù)的插件,為局部滾動(dòng)寫時(shí),遇到了很多局部滾動(dòng)的坑,在這里分享一下這些坑的解決方案。約定把產(chǎn)生滾動(dòng)條的元素稱之為視窗全局滾動(dòng)滾動(dòng)條在或者父級(jí)元素上??右粸g覽器局部滾動(dòng)默認(rèn)沒有彈性滾動(dòng)的效果。 起因 最近幾天在寫一個(gè)滾動(dòng)加載更多數(shù)據(jù)的插件(Scrollload),為局部滾動(dòng)寫demo時(shí),遇到了很多局部滾動(dòng)的坑,在這里分享一下這些坑的解決方案。以下的坑只針對(duì)...

    yhaolpz 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<