jdbc timeout問(wèn)題

記一次應(yīng)用hang起問(wèn)題處理
一. 程序主體
處理邏輯應(yīng)用開(kāi)起10個(gè)線程分批處理任務(wù),主體代碼如下:
      private Executor executor = Executors.newFixedThreadPool(THREAD_SIZE);
      for (LoanGroup group : groups) {
        LOGGER.info("商戶ID:{}轉(zhuǎn)換資產(chǎn)開(kāi)始...", group.getMerchantId());
        Integer totalSize = loanMapper.countNeedCastLoans(group.getMerchantId());
        Integer times = totalSize % BATCH_SIZE == 0 ? totalSize / BATCH_SIZE : totalSize / BATCH_SIZE + 1;
        CountDownLatch countDownLatch = new CountDownLatch(times);
        for (int i = 0; i < times; i++) {
            final int time = i;
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        processBatch(group.getMerchantId(), time);
                    } catch (Exception e) {
                        LOGGER.error("商戶ID:{}開(kāi)啟多線程轉(zhuǎn)換绊含,轉(zhuǎn)換批次:{}...錯(cuò)誤:{}", group.getMerchantId(), time, e);
                    } finally {
                        countDownLatch.countDown();
                    }
                }
            });
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
二. 問(wèn)題現(xiàn)象
應(yīng)用執(zhí)行過(guò)程中發(fā)現(xiàn)任務(wù)日志不再打印,且可以確定的是當(dāng)前任務(wù)并沒(méi)有執(zhí)行完畢,通過(guò)jstat -gcutil 1000 10 采樣垃圾回收情況發(fā)現(xiàn)連續(xù)10次打印結(jié)果都沒(méi)有變化,通過(guò)jmap -heap pid 查看虛擬機(jī)內(nèi)存使用情況琐馆,發(fā)現(xiàn)虛擬機(jī)內(nèi)存還有足夠的空間使用。后又通過(guò)jstack pid dump出線程棧信息如下:
    Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
   "Attach Listener" #47 daemon prio=9 os_prio=31        tid=0x00007ffe38e7a000 nid=0x8707 waiting on condition [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
    "pool-1-thread-10" #46 prio=5 os_prio=31       tid=0x00007ffe33e8f000 nid=0x8503 waiting on condition         [0x00007000125a3000]
     java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007415c10d8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)

  "pool-1-thread-9" #45 prio=5 os_prio=31 tid=0x00007ffe33167800 nid=0x8303 runnable [0x000070001249e000]
   java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174)
- locked <0x0000000740cf8780> (a com.mysql.jdbc.util.ReadAheadInputStream)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3008)
at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:2212)
at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1989)
at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3410)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:470)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3112)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2341)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2736)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2501)
- locked <0x0000000740cf36c8> (a com.mysql.jdbc.JDBC4Connection)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
- locked <0x0000000740cf36c8> (a com.mysql.jdbc.JDBC4Connection)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
- locked <0x0000000740cf36c8> (a com.mysql.jdbc.JDBC4Connection)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493)
10個(gè)線程中6個(gè)線程處于waiting狀態(tài)恒序,其他4個(gè)線程全如thread-9一樣處于RUNNABLE狀態(tài)瘦麸。而且處于RUNNABLE狀態(tài)的線程全都阻塞在at com.mysql.jdbc.util.ReadAheadInputStream.fill處。
三.分析處理
根據(jù)現(xiàn)象猜測(cè)可能是網(wǎng)絡(luò)抖動(dòng)丟包引起jdbc客戶端始終hang在套接字讀取數(shù)據(jù)處歧胁。
排查jdbc數(shù)據(jù)庫(kù)連接池配置以及mybatis的statement相關(guān)配置參數(shù)滋饲,發(fā)現(xiàn)并沒(méi)有對(duì)statement的timeout參數(shù)有相關(guān)配置,而且整個(gè)處理邏輯中也沒(méi)有用到事務(wù)喊巍。
定位問(wèn)題應(yīng)該就是引網(wǎng)絡(luò)抖動(dòng)引起而超時(shí)設(shè)置又沒(méi)有配置引起
解決方法:增加mybatis.configuration.default-statement-timeout 配置

參考資料:

1.http://www.importnew.com/2466.html
2.http://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屠缭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崭参,更是在濱河造成了極大的恐慌呵曹,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何暮,死亡現(xiàn)場(chǎng)離奇詭異奄喂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)海洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)跨新,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坏逢,你說(shuō)我怎么就攤上這事域帐。” “怎么了词疼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵俯树,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贰盗,道長(zhǎng)许饿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任舵盈,我火速辦了婚禮陋率,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秽晚。我一直安慰自己瓦糟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布赴蝇。 她就那樣靜靜地躺著菩浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劲蜻,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天陆淀,我揣著相機(jī)與錄音,去河邊找鬼先嬉。 笑死轧苫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疫蔓。 我是一名探鬼主播含懊,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼衅胀!你這毒婦竟也來(lái)了岔乔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拗小,失蹤者是張志新(化名)和其女友劉穎重罪,沒(méi)想到半個(gè)月后樱哼,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哀九,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搅幅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阅束。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茄唐,死狀恐怖息裸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沪编,我是刑警寧澤呼盆,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蚁廓,受9級(jí)特大地震影響访圃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜相嵌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一腿时、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饭宾,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春否淤,著一層夾襖步出監(jiān)牢的瞬間满败,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工叹括, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留算墨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓汁雷,卻偏偏與公主長(zhǎng)得像净嘀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侠讯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 挖藏? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,462評(píng)論 0 4
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理厢漩,服務(wù)發(fā)現(xiàn)膜眠,斷路器,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法溜嗜,類(lèi)相關(guān)的語(yǔ)法宵膨,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法炸宵,異常的語(yǔ)法辟躏,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,602評(píng)論 18 399
  • 原文:http://www.cubrid.org/blog/dev-platform/understanding-...
    九都散人閱讀 10,488評(píng)論 1 18
  • 余生今年30歲,是一家企業(yè)資深HR土全,精明干練捎琐,算是個(gè)事業(yè)有成的大齡女青年。在她的身邊不乏追求者裹匙,但她依舊孜然一身瑞凑,...
    文案幫WEN閱讀 375評(píng)論 0 0