一、問題描述java
附件同步會發送文件消息給消息中間件,而後會刪除數據庫中對應附件記錄,不斷的重複這樣的過程,可是最近的附件同步好像進入了死循環,消息中間件裏的附件數量一直在增長,能夠看到下面的阻塞的附加數量已經到1萬了,平時一天只有幾百的附件,怎麼會有這麼大的附件數量呢web
二、分析sql
boolean successFlag = SyncManagerService.getInstance().sendMessageToMQ(message); Log.info("[LiEMS數據同步引擎日誌--附件] 發送消息隊列結束 結果successFlg爲" + successFlag); if (successFlag) { Log.info("[LiEMS數據同步引擎日誌--附件] 刪除生產庫的dkdocmst_temp表記錄開始"); deleteTempData(db, detailDataObj); Log.info("[LiEMS數據同步引擎日誌--附件] 刪除生產庫的dkdocmst_temp表記錄結束"); }
先把文件發送到消息中間件,而後刪除數據庫對應的記錄,下次同步的就是之後的附件,這裏怎麼會重複發送呢,再者咱們上面這段代碼是放在同步塊裏的啊數據庫
synchronized (SyncBizFileDataToMQService.class) { }
初步懷疑就是數據庫沒有刪除成功,這時就要找證據了,打開日誌發現以下內容oracle
[ERROR][2019-07-04 17:51:53][SYSTEM]net.luculent.core.database.DBException: Connection has already been closed. with sql is delete from DKDOCMST_TEMP where DOC_ID = '1146689096949694464' and TEMP_PKVAL = '1198020'
三、緣由app
從上面來看數據庫鏈接被自動釋放了,有個直覺就是發送附件時間太長,不活動鏈接多長時間就自動釋放,可是發送大附件的又不是頭一次,確定是現場改了配置,因而聯繫現場人,現場人說優化過weblogic的參數,各類截圖給我確認,但是看着都不像,最後想到weblogic的數據庫鏈接參數都是在配置文件中的,因而打開配置文件驚奇的發現了一個配置項Inactive Connection Time-Out,配置了60,馬上讓現場人去掉這個配置,現場人也和我解釋是根據優化手冊配置的,總結一下吧,畢竟花了很長時間排查這個問題,最後附上這個參數的含義:https://blogs.oracle.com/saas-fusion-app-performance/inactive-connection-time-out優化