tomcat自帶連線池dbcp配置以及最佳化說明

testingbang發表於2019-08-16

一個網站每天大概有20萬的訪問量,使用的tomcat自帶dbcp連線池,一般網站訪問很好,速度也很快,但是過一段時間後,總是報timeout waiting for idle object的異常資訊,最後查了apache tomcat的官方文件,終於找到解決方法:

資料庫連線池建立和管理池中的資料庫連線物件。重建和複用已存在的連線物件要比建立新的連線要頻繁的多。

連線池會存在這樣一個問題。web應用已經明確關閉ResultSet,Statement,及Connection物件;當關閉出現故障的web應用所使用的資源
時將會導致這個連線資源不能在複用,這就是資料庫連線池洩露,最終導致在你的應用程式中沒有連線物件可以使用。


這當然是有解決方法的,Apache Commons DBCP可以配置為跟蹤和恢復這些被棄的資料庫連線物件。不僅恢復還可以跟蹤那些連線資料庫卻沒有關閉的程式碼片段。


要增加連線池中被棄的連線重新可用,開啟配置檔案,為Resource標籤配置以下引數:

removeAbandonedOnBorrow=true
removeAbandonedOnMaintenance=true
removeAbandonedTimeout="60"
logAbandoned="true"

預設情況下removeAbandonedOnBorrow和removeAbandonedOnMaintenance都是為false。

注意:removeAbandonedOnMaintenance只有在timeBetweenEvictionRunsMillis設定為正數的情況下才有效。

removeAbandonedTimeout屬性是設定資料庫連線被釋最多空閒時間多少秒之後設定為空閒。預設移除廢棄連線的時間為300秒。

提示:

如果啟用removeAbandonedOnMaintenance 或 removeAbandonedOnBorrow,那些被認為廢棄的連線物件有可能被池回收。這個機制以下情況下會觸發:
當getNumIdle() < 2並且getNumActive() > getMaxTotal() - 3及emoveAbandonedOnBorrow 設定為true時;或 當removeAbandonedOnMaintenance設定為true並且回收完成時。
打個比方說:
如果設定maxTotal=20,當有18個活躍連線、1個空閒連線時會觸發removeAbandonedOnBorrow,不過僅是那些使用時間超過removeAbandonedTimeout秒數的活動連線才會被移除(預設是300秒)
,遍歷resultset不作為正在使用。建立Statement,PrepareStatement或CallableStatement或使用其中一個執行查詢(執行exceute方法)重置父連線的lastUsed屬性。

 

DBCP連線池配置引數講解

-----------------------------

一、Apache官方DBCP文件給出的配置示例:

可參見:

<Context>

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

               maxActive="100" maxIdle="30" maxWait="10000"

               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/javatest"/>

</Context>

 

tomcat JDBC連線池配置示例,自動檢查連線的可用性,dbcp定時檢測連線,dbcp自動重連的配置

  1. < Resource   
  2. name = "jdbc/TestDB"   JNDI資料來源的name,查詢時用:java:comp/env/jdbc/TestDB  
  3. type = "javax.sql.DataSource"   
  4. factory = "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"   
  5. driverClassName = "com.mysql.jdbc.Driver"  JDBC驅動類  
  6. url ="jdbc:mysql://localhost:3306/test?  
  7. characterEncoding = UTF -8&amp; autoReconnectForPools = true &amp; rewriteBatchedStatements = true &amp; useCursorFetch = true &amp; defaultFetchSize = 20 " 資料庫URL地址    
  8. username = "xxx"  訪問資料庫使用者名稱  
  9. password = "xxx"  訪問資料庫的密碼  
  10.    
  11. maxWait = "3000"  從池中取連線的最大等待時間,單位ms.  
  12. initialSize = "10"   初始化連線  
  13. maxIdle = "60"    最大空閒連線  
  14. minIdle = "10"    最小空閒連線  
  15. maxActive = "80"  最大活動連線  
  16.    
  17. validationQuery  =  "SELECT 1"   驗證使用的SQL語句  
  18. testWhileIdle  =  "true"       指明連線是否被空閒連線回收器(如果有)進行檢驗.如果檢測失敗,則連線將被從池中去除.  
  19. testOnBorrow  =  "false"    借出連線時不要測試,否則很影響效能  
  20. timeBetweenEvictionRunsMillis  =  "30000"   每30秒執行一次空閒連線回收器  
  21. minEvictableIdleTimeMillis  =  "1800000"   池中的連線空閒30分鐘後被回收  
  22. numTestsPerEvictionRun = "10"  在每次空閒連線回收器執行緒(如果有)執行時檢查的連線數量  
  23.       
  24. removeAbandoned = "true"   連線洩漏回收引數,當可用連線數少於3個時才執行  
  25. removeAbandonedTimeout = "180"   連線洩漏回收引數,180秒,洩露的連線可以被刪除的超時值  
  26. />   

 

 

DBCP連線池的自我檢測

-----------------------------

預設配置的DBCP連線池,是不對池中的連線做測試的,有時連線已斷開了,但DBCP連線池不知道,還以為連線是好的呢。

應用從池中取出這樣的連線訪問資料庫一定會報錯。這也是好多人不喜歡DBCP的原因。

 

問題例一:

MySQL8小時問題,Mysql伺服器預設連線的“wait_timeout”是8小時,也就是說一個connection空閒超過8個小時,Mysql將自動斷開該 connection。

但是DBCP連線池並不知道連線已經斷開了,如果程式正巧使用到這個已經斷開的連線,程式就會報錯誤。

 

問題例二:

    以前還使用Sybase資料庫,由於某種原因,資料庫死了後重啟、或斷網後恢復。

    等了約10分鐘後,DBCP連線池中的連線還都是不能使用的(斷開的),訪問資料應用一直報錯,最後只能重啟Tomcat問題才解決 。

 

解決方案:

    方案1、定時對連線做測試,測試失敗就關閉連線。

    方案2、控制連線的空閒時間達到N分鐘,就關閉連線,(然後可再新建連線)。

    以上兩個方案使用任意一個就可以解決以述兩類問題。如果只使用方案2,建議 N <= 5分鐘。連線斷開後最多5分鐘後可恢復。

    也可混合使用兩個方案,建議 N = 30分鐘。

    

    下面就是DBCP連線池,同時使用了以上兩個方案的配置配置

    validationQuery = "SELECT 1"  驗證連線是否可用,使用的SQL語句

    testWhileIdle = "true"      指明連線是否被空閒連線回收器(如果有)進行檢驗.如果檢測失敗,則連線將被從池中去除.

    testOnBorrow = "false"   借出連線時不要測試,否則很影響效能

    timeBetweenEvictionRunsMillis = "30000"  每30秒執行一次空閒連線回收器

    minEvictableIdleTimeMillis = "1800000"  池中的連線空閒30分鐘後被回收,預設值就是30分鐘。

    numTestsPerEvictionRun="3" 在每次空閒連線回收器執行緒(如果有)執行時檢查的連線數量,預設值就是3.

    

    解釋:

    配置timeBetweenEvictionRunsMillis = "30000"後,每30秒執行一次空閒連線回收器(獨立執行緒)。並每次檢查3個連線,如果連線空閒時間超過30分鐘就銷燬。銷燬連線後,連線數量就少了,如果小於minIdle數量,就新建連線,維護數量不少於minIdle,過行了新老更替。

    testWhileIdle = "true" 表示每30秒,取出3條連線,使用validationQuery = "SELECT 1" 中的SQL進行測試 ,測試不成功就銷燬連線。銷燬連線後,連線數量就少了,如果小於minIdle數量,就新建連線。

    testOnBorrow = "false" 一定要配置,因為它的預設值是true。false表示每次從連線池中取出連線時,不需要執行validationQuery = "SELECT 1" 中的SQL進行測試。若配置為true,對效能有非常大的影響,效能會下降7-10倍。所在一定要配置為false.

    每30秒,取出numTestsPerEvictionRun條連線(本例是3,也是預設值),發出"SELECT 1" SQL語句進行測試 ,測試過的連線不算是“被使用”了,還算是空閒的。連線空閒30分鐘後會被銷燬。

    

 

DBCP連線池配置引數注意事項  

-----------------------------

maxIdle值與maxActive值應配置的接近。

因為,當連線數超過maxIdle值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷燬。而不是我想要的空閒M秒後再銷燬起一個緩衝作用。這一點DBCP做的可能與你想像的不一樣。

若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的建立、銷燬連線,連線數在maxIdle與maxActive間快速頻繁波動,這不是我想要的。

高負載系統的maxIdle值可以設定為與maxActive相同或設定為-1(-1表示不限制),讓連線數量在minIdle與maxIdle間緩衝慢速波動。

 

timeBetweenEvictionRunsMillis建議設定值

initialSize="5",會在tomcat一啟動時,建立5條連線,效果很理想。

但同時我們還配置了minIdle="10",也就是說,最少要保持10條連線,那現在只有5條連線,哪什麼時候再建立少的5條連線呢?

1、等業務壓力上來了, DBCP就會建立新的連線。

2、配置timeBetweenEvictionRunsMillis=“時間”,DBCP會啟用獨立的工作執行緒定時檢查,補上少的5條連線。銷燬多餘的連線也是同理。

 

連線銷燬的邏輯

------------------------------

DBCP的連線數會在  0 - minIdle - maxIdle - maxActive  之間變化。變化的邏輯描述如下:

 

預設未配置initialSize(預設值是0)和timeBetweenEvictionRunsMillis引數時,剛啟動tomcat時,連線數是0。當應用有一個併發訪問資料庫時DBCP建立一個連線。

目前連線數量還未達到minIdle,但DBCP也不自動建立新連線已使數量達到minIdle數量(沒有一個獨立的工作執行緒來檢查和建立)。

隨著應用併發訪問資料庫的增多,連線數也增多,但都與minIdle值無關,很快minIdle被超越,minIdle值一點用都沒有。

直到連線的數量達到maxIdle值,這時的連線都是隻增不減的。 再繼續發展,連線數再增多並超過maxIdle時,使用完的連線(剛剛空閒下來的)會立即關閉,總體連線的數量穩定在maxIdle但不會超過maxIdle。

但活動連線(在使用中的連線)可能數量上瞬間超過maxIdle,但永遠不會超過maxActive。

這時如果應用業務壓力小了,訪問資料庫的併發少了,連線數也不會減少(沒有一個獨立的執行緒來檢查和銷燬),將保持在maxIdle的數量。

 

預設未配置initialSize(預設值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)引數時,剛啟動tomcat時,連線數是0。馬上應用有一個併發訪問資料庫時DBCP建立一個連線。

目前連線數量還未達到minIdle,每30秒DBCP的工作執行緒檢查連線數是否少於minIdle數量,若少於就建立新連線直到達到minIdle數量。

隨著應用併發訪問資料庫的增多,連線數也增多,直到達到maxIdle值。這期間每30秒DBCP的工作執行緒檢查連線是否空閒了30分鐘,若是就銷燬。但此時是業務的高峰期,是不會有長達30分鐘的空閒連線的,工作執行緒查了也是白查,但它在工作。到這裡連線數量一直是呈現增長的趨勢。

當連線數再增多超過maxIdle時,使用完的連線(剛剛空閒下來)會立即關閉,總體連線的數量穩定在maxIdle。停止了增長的趨勢。但活動連線(在使用中的連線)可能數量上瞬間超過maxIdle,但永遠不會超過maxActive。

這時如果應用業務壓力小了,訪問資料庫的併發少了,每30秒DBCP的工作執行緒檢查連線(預設每次查3條)是否空閒達到30分鐘(這是預設值),若連線空閒達到30分鐘,就銷燬連線。這時連線數減少了,呈下降趨勢,將從maxIdle走向minIdle。當小於minIdle值時,則DBCP建立新連線已使數量穩定在minIdle,並進行著新老更替。

 

配置initialSize=“10”時,tomcat一啟動就建立10條連線。其它同上。

 

minIdle要與timeBetweenEvictionRunsMillis配合使用才有用,單獨使用minIdle不會起作用。

 

 

Tomcat中配置DBCP連線池

-----------------------------

Tomcat自帶DBCP的包,是$CATALINA_HOME/lib/tomcat-dbcp.jar。

tomcat-dbcp.jar含有commons pool、commons DBCP兩個包的內容。但只含有與連線池有關的類。

資料來源配置在context.xml檔案中, 要在tomcat的lib目錄中放jdbc 驅動包

資料來源配置在server.xml的host中,不需要在tomcat的lib目錄中放jdbc 驅動包,只使用工程中的jdbc驅動包

 

 

JNDI配置:更改tomcat的server.xml或context.xml

 

    全域性的資料來源:

    如果需要配置全域性的 Resource,則在server.xml的GlobalNamingResources節點裡加入Resource,再在Context節點裡加入ResourceLink的配置。

    全域性的resource只是為了重用,方便所有該tomcat下的web工程的資料來源管理,但如果你的tomcat不會同時載入多個web工程,也就是說一個tomcat只載入一個web工程時,是沒有必要配置全域性的resource的。

 

每個web工程一個資料來源:

在$CATALINA_HOME/conf/context.xml的根節點Context里加入Resource配置。這種配置方法,你在context.xml配置了一個資料來源,但Tomcat中有同時執行著5個工程,那了就壞事兒了,這個在Tomcat啟動時資料來源被建立了5份,每個工程1份資料來源。連線數會是你配置的引數的5倍。

只有在你的Tomcat只載入一個web工程時,才可以直接以context.xml配置資料來源。

 

<Resource name="jdbc/testDB"       //指定的jndi名稱,會用於spring資料來源bean的配置和ResourceLink的配置

               type="javax.sql.DataSource"   //資料來源型別,使用標準的javax.sql.DataSource

               driverClassName="com.mysql.jdbc.Driver"    //JDBC驅動器 

               url="jdbc:mysql://localhost:3306/test" //資料庫URL地址             

               username="test"     //資料庫使用者名稱

               password="test"   //資料庫密碼

               maxIdle="40"   //最大的空閒連線數

               maxWait="4000" //當池的資料庫連線已經被佔用的時候,最大等待時間

               maxActive="40" //連線池當中最大的資料庫連線

               removeAbandoned="true" 

               removeAbandonedTimeout="180"

               logAbandoned="true" //被丟棄的資料庫連線是否做記錄,以便跟蹤

               factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />

 

      這裡的factory指的是該Resource 配置使用的是哪個資料來源配置類,這裡使用的是tomcat自帶的標準資料來源Resource配置類,這個類也可以自己寫,實現javax.naming.spi.ObjectFactory 介面即可。某些地方使用的commons-dbcp.jar中的org.apache.commons.dbcp.BasicDataSourceFactory,如果使用這個就需把commons-dbcp.jar及其依賴的jar包,都放在tomcat的lib下,光放在工程的WEB-INF/lib下是不夠的。

 

     ResourceLink 的配置有多種:

 

     1)tomcat安裝目錄下的conf/context.xml,把全域性的resource直接公開給該tomcat下的所有web工程,在Context節點中加入:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>   

不建議在此檔案中,不使用<ResourceLink/>,而使用<Resource/>直接配置資料來源,原因上面已說明了。   

 

     2)tomcat安裝目錄下的conf/server.xml,該方法可以指定把哪些source繫結到哪個web工程下。

<!-- 新增,第一行為載入的工程配置,第二行是該工程需要的ResourceLink配置 -->

<context docBase="/web/webapps/phoenix" path="" reloadable="false"> 

      <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

</context>

也可在此檔案中,不使用<ResourceLink/>,而使用<Resource/>直接配置資料來源。

 

     3)安裝目錄下的conf/localhost/下建立一個xml檔案,檔名是<yourAppName>.xml。比如工程名為test,則該xml名為test.xml。

<?xml version="1.0" encoding="UTF-8"?>

<Context>   

    <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>       

</context>

也可在此檔案中,不使用<ResourceLink/>,而使用<Resource/>直接配置資料來源。

 

     4)tomcat安裝目錄下的webappstestMETA-INFcontext.xml的Context節點中增加:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

也可在此檔案中,不使用<ResourceLink/>,而使用<Resource/>直接配置資料來源。

 

 

本文內容都在tomcat6.0上執行測試過,還下載了commons DBCP的原始碼,加入了跟蹤日誌,用於驗證本文的理論。

 

由於commons-dbcp所用的連線池出現版本升級,因此commons-dbcp2中的資料庫池連線配置也發生了變化,具體的引數配置說明如下:

引數 描述
username 透過JDBC建立一個連線所需的使用者名稱
password 透過JDBC建立一個連線所需的密碼
url 透過JDBC建立一個連線所需的URL
driverClassName 所使用的JDBC驅動的類全名
connectionProperties 連線引數是在建立一個新連線時傳送給JDBC驅動的
字串的格式必須是[引數名=引數值;]
提示:使用者名稱和密碼屬性是需要明確指出的,所以這兩個引數不需要包含在這裡

引數 預設值 描述
defaultAutoCommit JDBC驅動的預設值 透過這個池建立連線的預設自動提交狀態。如果不設定,則setAutoCommit 方法將不被呼叫。
defaultReadOnly JDBC驅動的預設值 透過這個池建立連線的預設只讀狀態。 如果不設定,則 setReadOnly   方法將不被呼叫。(部分驅動不支援只讀模式,如: Informix
defaultTransactionIsolation JDBC驅動的預設值 透過這個池建立連線的預設事務策略,設定值為下列中的某一個: (參考  javadoc )
  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog
透過這個池建立連線的預設 預設的 catalog 
cacheState true 如果設定為true,池化的連線將在第一次讀或寫,以及隨後的寫的時候快取當前的只讀狀態和自動提交設定。這樣就省去了對getter的任何進一步的呼叫時對資料庫的額外查詢。如果直接訪問底層連線,只讀狀態和/或自動提交設定改變快取值將不會被反映到當前的狀態,在這種情況下,應該將該屬性設定為false以禁用快取。

引數 預設值 描述
initialSize 當這個池被啟動時初始化的建立的連線個數,起始生效版本:1.2
maxTotal 8 可以在這個池中同時被分配的有效連線數的最大值,如設定為負數,則不限制
maxIdle 8 可以在池中保持空閒的最大連線數,超出設定值之外的空閒連線將被回收, 如設定為負數,則不限制
minIdle 可以在池中保持空閒的最小連線數,超出設定值之外的空閒連線將被建立, 如設定為0,則不建立
maxWaitMillis indefinitely (如果沒有可用連線)池在丟擲異常前 等待的一個連線被歸還的最大毫秒數,設定為-1則等待時間不確定

  提示 : 如果在高負載的系統中將maxIdle的值設定的很低,則你可能會發現在一個新的連線剛剛被建立的時候就立即被關閉了。這是活躍的執行緒及時關閉連線要比那些開啟連線的執行緒要快,導致空閒的連線數大於maxIdle。高負載系統中maxIdle的最合適的配置值是多樣的,但是預設值是一個好的開始點。


引數 預設值 描述
validationQuery
在連線池返回連線給呼叫者前用來進行連線校驗的查詢sql。如果指定,則這個查詢必須是一個至少返回一行資料的SQL SELECT語句。如果沒有指定,則連線將透過呼叫isValid() 方法進行校驗。
testOnCreate false 指明物件在建立後是否需要被校驗,如果物件校驗失敗,則觸發物件建立的租借嘗試將失敗。
testOnBorrow true 指明在從池中租借物件時是否要進行校驗,如果物件校驗失敗,則物件將從池子釋放,然後我們將嘗試租借另一個
testOnReturn false 指明在將物件歸還給連線池前是否需要校驗。
testWhileIdle false 指明物件是否需要透過物件驅逐者進行校驗(如果有的話),假如一個物件校驗失敗,則物件將被從池中釋放。
timeBetweenEvictionRunsMillis -1 空閒物件驅逐執行緒執行時的休眠毫秒數,如果設定為非正數,則不執行空閒物件驅逐執行緒。
numTestsPerEvictionRun 3 在每個空閒物件驅逐執行緒執行過程中中進行檢查的物件個數。(如果有的話)
minEvictableIdleTimeMillis 1000 * 60 * 30 符合物件驅逐物件驅逐條件的物件在池中最小空閒毫秒總數 (如果有的話)
softMiniEvictableIdleTimeMillis -1 符合物件驅逐物件驅逐條件的物件在池中最小空閒毫秒總數,額外的條件是池中至少保留有 minIdle所指定的個數的連線。當 miniEvictableIdleTimeMillis 被設定為一個正數,空閒連線驅逐者首先檢測miniEvictableIdleTimeMillis,當空閒連線被驅逐者訪問時,首先與miniEvictableIdleTimeMillis 所指定的值進行比較(而不考慮當前池中的空閒連線數),然後比較softMinEvictableIdleTimeMillis所指定的連線數,包括minIdle條件。
maxConnLifetimeMillis -1 一個連線的最大存活毫秒數。如果超過這個時間,則連線在下次啟用、鈍化、校驗時都將會失敗。如果設定為0或小於0的值,則連線的存活時間是無限的。
connectionInitSqls null 在第一次建立時用來初始化物理連線的SQL語句集合。這些語句只在配置的連線工廠建立連線時被執行一次。
lifo true 設定為true表明連線池(如果池中有可用的空閒連線時)將返回最後一次使用的租借物件(最後進入)。設定為false則表明池將表現為FIFO佇列——將會按照它們被歸還的順序 從空閒連線例項池中獲取連線

引數 預設值 描述
poolPreparedStatements false 設定該連線池的預處理語句池是否生效
maxOpenPreparedStatements unlimited 可以在語句池中同時分配的最大語句數。設定為負數則不限制。

 這個設定同時作用於預處理語句池. 當一個可用的語句池被建立給每一個連線時,透過以下方法建立的預處理語句將被池化。

  • public PreparedStatement prepareStatement(String sql)
  • public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

  提示  -要確保你的連線會留下一些資源給其他語句。池化預處理語句可能會在資料庫中保持他們的遊標,可能會引起連線的遊標越界,尤其是maxOpenPreparedStatements的值被設定為預設值(無限的),而且一個應用程式可能會為每個連線開啟大量不同的預處理語句。為了避免這個問題maxOpenPreparedStatements應該被設定為一個小於連線可以開啟的最大遊標數的值。


引數 預設值 描述
accessToUnderlyingConnectionAllowed false 控制PoolGuard是否可以訪問底層連線 

如果允許訪問的話,使用如下程式碼結構:


    Connection conn = ds.getConnection();     Connection dconn =((DelegatingConnection) conn).getInnermostDelegate();     ...     conn.close()

 預設值為false,這是一個有著潛在風險的操作,使用不當可能會導致非常嚴重的後果。(在守衛連線已被關閉的情況下,關閉底層連線或者繼續使用它),只有在你需要直接訪問驅動的特有擴充套件是可以謹慎使用。

  NOTE:  除了最原始那個之外,不要關閉底層連線


引數 預設值 描述
removeAbandoned false 標記是否刪除超過removeAbandonedTimout所指定時間的 被遺棄的連線。
如果設定為true,則一個連線在超過removeAbandonedTimeout所設定的時間未使用即被認為是應該被拋棄並應該被移除的。建立一個語句,預處理語句,可呼叫語句或使用它們其中的一個執行查詢(使用執行方法中的某一個)會重新設定其父連線的lastUsed 屬性。
在寫操作較少的應用程式中將該引數設定為true可以將資料庫連線從連線關閉失敗中恢復。
removeAbandonedTimeout 300 一個被拋棄連線可以被移除的超時時間,單位為秒
logAbandoned false 標誌是否為應用程式中遺棄語句或連線的程式碼開啟日誌堆疊追蹤。
因為一個堆疊跟蹤已被建立,被拋棄的語句和連線相關的日誌將被覆蓋到開啟每個連線或者建立一個Statement時

如果你啟用了removeAbandoned,則一個連線被池回收再利用是可能的,因為它被認為是已遺棄 在(getNumIdle() < 2) and (getNumActive() > getMaxTotal() - 3)成立時,這個機制將被觸發。

 例如, maxTotal=20 ,這裡有18個活躍連線,一個限制連線,將觸發 "removeAbandoned"。但是隻有在活動連線超過 "removeAbandonedTimeout" 所指定的秒數內未使用才會被刪除(預設為300秒)。遍歷一個結果集並不被統計為被使用,建立一個語句,預處理語句,可呼叫語句或使用它們其中的一個執行查詢(使用執行方法中的某一個)會重新設定其父連線的lastUsed 屬性


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2653936/,如需轉載,請註明出處,否則將追究法律責任。

相關文章