Tomcat JDBC pool源碼部析 (2)

上一篇主要分析了獲取鏈接,本篇分析歸還鏈接與鏈接清理。歸還鏈接基本上就一個入口:ide

  
  
           
  
  
  1. protected void returnConnection(PooledConnection con) { 
  2.        if (isClosed()) { 
  3.            //if the connection pool is closed 
  4.            //close the connection instead of returning it 
  5.            release(con); 
  6.            return
  7.        } //end if 
  8.  
  9.        if (con != null) { 
  10.            try { 
  11.                con.lock(); 
  12.  
  13.                if (busy.remove(con)) { 
  14.  
  15.                    if (!shouldClose(con,PooledConnection.VALIDATE_RETURN)) { 
  16.                        con.setStackTrace(null); 
  17.                        con.setTimestamp(System.currentTimeMillis()); 
  18.                        if (((idle.size()>=poolProperties.getMaxIdle()) && !poolProperties.isPoolSweeperEnabled()) || (!idle.offer(con))) { 
  19.                            if (log.isDebugEnabled()) { 
  20.                                log.debug("Connection ["+con+"] will be closed and not returned to the pool, idle["+idle.size()+"]>=maxIdle["+poolProperties.getMaxIdle()+"] idle.offer failed."); 
  21.                            } 
  22.                            release(con); 
  23.                        } 
  24.                    } else { 
  25.                        if (log.isDebugEnabled()) { 
  26.                            log.debug("Connection ["+con+"] will be closed and not returned to the pool."); 
  27.                        } 
  28.                        release(con); 
  29.                    } //end if 
  30.                } else { 
  31.                    if (log.isDebugEnabled()) { 
  32.                        log.debug("Connection ["+con+"] will be closed and not returned to the pool, busy.remove failed."); 
  33.                    } 
  34.                    release(con); 
  35.                } 
  36.            } finally { 
  37.                con.unlock(); 
  38.            } 
  39.        } //end if 
  40.    } // 

先看鏈接池有沒有關閉,若是在關閉狀態,則調用release(con)關閉該鏈接。spa

獲取當前鏈接的鎖,從繁忙隊列中移除該鏈接。放入空閒隊列中以備其餘請求使用。有如下幾種狀況,該鏈接會直接關閉,而非放入空閒隊列。debug

1.     從繁忙隊列中移除該鏈接時失敗。(此現象不多見)日誌

2.     空閒鏈接數大小容許的最大空閒鏈接數,且沒有啓用空閒鏈接清理器。orm

3.     放入空閒隊列失敗。(與1比較相似,比較少見)隊列

能夠看出歸還鏈接比較簡單。ci

對於鏈接清理,鏈接池提供了一個Timer來完成:rem

class PoolCleaner extends TimerTaskget

Timer主要清理三個方面的鏈接。string

1.     須要丟棄的鏈接,從繁忙隊列清除。

這類鏈接主要是長期沒有歸還的鏈接。鏈接池提供了兩個時間值:AbandonTimeoutSuspectTimeout。對於超過AbandonTimeout鏈接,若是Pool當前符合清理Abandon鏈接的條件,則執行關閉。

對於大於的SuspectTimeout的鏈接,輸出日誌提醒。

2.     空閒的鏈接,從空閒隊列中清除。

關閉空閒時間過長的鏈接,沒什麼好說的。

3.     對空閒鏈接進行驗證(若是),驗證失敗的鏈接。

   VALIDATE_IDLE驗證方式是用戶指定的用於以空閒鏈接進行驗證策略,意議不大。

相關文章
相關標籤/搜索