druid + spring 事務 + removeAbandonedTimeout 超時回收導致的問題
阿新 • • 發佈:2018-12-11
今天使用上述組合 做專案。。
在做一個需要較長時間使用資料庫的 請求時,專案日誌沒有任何報錯,但是資料庫也沒有插入程式碼。
初步猜測是 資料庫連線超過 removeAbandonedTimeout 時間導致資料庫連線被強制回收,但是為什麼沒有報錯呢(由於開發環境資料較少,沒有這個現象,
但是生產環境資料較多,當時資料也沒插入成功,日誌也沒報錯,一臉懵)。。
沒辦法,只有在開發模擬資料,然後跟蹤程式碼,超時時間到後,會走到這麼一段程式碼:
try { // This is an around advice: Invoke the next interceptor in the chain.// This will normally result in a target object being invoked. retVal = invocation.proceedWithInvocation(); } catch (Throwable ex) { // target invocation exception completeTransactionAfterThrowing(txInfo, ex); throw ex; }finally { cleanupTransactionInfo(txInfo); }
進入 catch 中 執行
completeTransactionAfterThrowing(txInfo, ex); (看方法名:事務完成後丟擲錯誤)
if (txInfo != null && txInfo.hasTransaction()) { if (logger.isTraceEnabled()) { logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() + "] after exception: " + ex); } // 這個ex 就是我們要的錯誤資訊,但是這裡的日誌級別卻是 trace ,無語啊。。我<logger name="org.springframework" level="error"/>是error ,,好吧,日誌是打印不出來。。靠
if (txInfo.transactionAttribute.rollbackOn(ex)) {
try { txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus()); }
catch (TransactionSystemException ex2) {
logger.error("Application exception overridden by rollback exception", ex); ex2.initApplicationException(ex); throw ex2;
}