国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

事務與多線程的坑及調優Tips

wums / 3532人閱讀

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

起因及介紹

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

@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())) {
        // 提現...
        // 充值
        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;
}
問題分析

上面代碼中將對賬數據按類型歸類后,得到一個Map>,key為類型,value為數據。考慮到數據類型有很多種,然后使用了parallelStream()。在最近的一次自測中,由于開發數據庫網絡問題,造成事務處理超時,但發現數據沒有回滾!

開始沿著數據庫超時中斷機制的思路找問題,花了比較多的時間在分析是數據庫端觸發了中斷,還是應用層主動中斷,以及兩者對是否回滾有啥區別。。最后發現這些都不是原因

第二天一早突然想到這里的parallelStream()可能是罪魁禍首,因為它開啟了多線程(多線程往往有問題),本機環境一共有4個worker在處理(包含主線程),但是超時導致的org.springframework.transaction.TransactionTimedOutException錯誤是發生在主線程內的,那肯定只有主線程回滾了。后經測試證實。

總結

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

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

調優Tips

1. 線程池的大小

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

其中:

CPU利用率介于0和1之間

W/C是等待時間與計算時間的比率

源自《Java并發編程實戰》Brian Goetz的建議

2. 文件下載

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70709.html

相關文章

  • 學Java編程需要注意的地方

    摘要:學編程真的不是一件容易的事不管你多喜歡或是多會編程,在學習和解決問題上總會碰到障礙。熟練掌握核心內容,特別是和多線程初步具備面向對象設計和編程的能力掌握基本的優化策略。   學Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學習和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進步的機會,因為你要一直不斷的學習才能很好的解決你面前的難題...

    leanxi 評論0 收藏0
  • 你和阿里資深架構師之間,差的不僅僅是年齡(進階必看)

    摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...

    huaixiaoz 評論0 收藏0
  • ios局部滾動坑及解決方案

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

    yhaolpz 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<