1. 程式人生 > >druid + spring 事務 + removeAbandonedTimeout 超時回收導致的問題

druid + spring 事務 + removeAbandonedTimeout 超時回收導致的問題

今天使用上述組合 做專案。。

在做一個需要較長時間使用資料庫的 請求時,專案日誌沒有任何報錯,但是資料庫也沒有插入程式碼。

初步猜測是 資料庫連線超過 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;
}