真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

tomcat自帶連接池dbcp配置以及優(yōu)化說明

一個網(wǎng)站每天大概有20萬的訪問量,使用的tomcat自帶dbcp連接池,一般網(wǎng)站訪問很好,速度也很快,但是過一段時間后,總是報timeout waiting for idle object的異常信息,最后查了apache tomcat的官方文檔,終于找到解決方法:

站在用戶的角度思考問題,與客戶深入溝通,找到青海網(wǎng)站設計與青海網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋青海地區(qū)。

數(shù)據(jù)庫連接池創(chuàng)建和管理池中的數(shù)據(jù)庫連接對象。重建和復用已存在的連接對象要比創(chuàng)建新的連接要頻繁的多。

連接池會存在這樣一個問題。web應用已經(jīng)明確關閉ResultSet,Statement,及Connection對象;當關閉出現(xiàn)故障的web應用所使用的資源
時將會導致這個連接資源不能在復用,這就是數(shù)據(jù)庫連接池泄露,最終導致在你的應用程序中沒有連接對象可以使用。


這當然是有解決方法的,Apache Commons DBCP可以配置為跟蹤和恢復這些被棄的數(shù)據(jù)庫連接對象。不僅恢復還可以跟蹤那些連接數(shù)據(jù)庫卻沒有關閉的代碼片段。


要增加連接池中被棄的連接重新可用,打開配置文件,為Resource標簽配置以下參數(shù):

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

默認情況下removeAbandonedOnBorrow和removeAbandonedOnMaintenance都是為false。

注意:removeAbandonedOnMaintenance只有在timeBetweenEvictionRunsMillis設置為正數(shù)的情況下才有效。

removeAbandonedTimeout屬性是設置數(shù)據(jù)庫連接被釋最多空閑時間多少秒之后設置為空閑。默認移除廢棄連接的時間為300秒。

提示:

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

 

DBCP連接池配置參數(shù)講解

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

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

可參見:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

 

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

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

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

 

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

  1. < Resource   
  2. name = "jdbc/TestDB"   JNDI數(shù)據(jù)源的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驅(qū)動類  
  6. url ="jdbc:mysql://localhost:3306/test?  
  7. characterEncoding = UTF -8& autoReconnectForPools = true & rewriteBatchedStatements = true & useCursorFetch = true & defaultFetchSize = 20 " 數(shù)據(jù)庫URL地址    
  8. username = "xxx"  訪問數(shù)據(jù)庫用戶名  
  9. password = "xxx"  訪問數(shù)據(jù)庫的密碼  
  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"  在每次空閑連接回收器線程(如果有)運行時檢查的連接數(shù)量  
  23.       
  24. removeAbandoned = "true"   連接泄漏回收參數(shù),當可用連接數(shù)少于3個時才執(zhí)行  
  25. removeAbandonedTimeout = "180"   連接泄漏回收參數(shù),180秒,泄露的連接可以被刪除的超時值  
  26. />   

 

 

DBCP連接池的自我檢測

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

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

應用從池中取出這樣的連接訪問數(shù)據(jù)庫一定會報錯。這也是好多人不喜歡DBCP的原因。

 

問題例一:

MySQL8小時問題,Mysql服務器默認連接的“wait_timeout”是8小時,也就是說一個connection空閑超過8個小時,Mysql將自動斷開該 connection。

但是DBCP連接池并不知道連接已經(jīng)斷開了,如果程序正巧使用到這個已經(jīng)斷開的連接,程序就會報錯誤。

 

問題例二:

    以前還使用Sybase數(shù)據(jù)庫,由于某種原因,數(shù)據(jù)庫死了后重啟、或斷網(wǎng)后恢復。

    等了約10分鐘后,DBCP連接池中的連接還都是不能使用的(斷開的),訪問數(shù)據(jù)應用一直報錯,最后只能重啟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" 在每次空閑連接回收器線程(如果有)運行時檢查的連接數(shù)量,默認值就是3.

    

    解釋:

    配置timeBetweenEvictionRunsMillis = "30000"后,每30秒運行一次空閑連接回收器(獨立線程)。并每次檢查3個連接,如果連接空閑時間超過30分鐘就銷毀。銷毀連接后,連接數(shù)量就少了,如果小于minIdle數(shù)量,就新建連接,維護數(shù)量不少于minIdle,過行了新老更替。

    testWhileIdle = "true" 表示每30秒,取出3條連接,使用validationQuery = "SELECT 1" 中的SQL進行測試 ,測試不成功就銷毀連接。銷毀連接后,連接數(shù)量就少了,如果小于minIdle數(shù)量,就新建連接。

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

    每30秒,取出numTestsPerEvictionRun條連接(本例是3,也是默認值),發(fā)出"SELECT 1" SQL語句進行測試 ,測試過的連接不算是“被使用”了,還算是空閑的。連接空閑30分鐘后會被銷毀。

    

 

DBCP連接池配置參數(shù)注意事項  

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

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

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

若maxIdle與maxActive相差較大,在高負載的系統(tǒng)中會導致頻繁的創(chuàng)建、銷毀連接,連接數(shù)在maxIdle與maxActive間快速頻繁波動,這不是我想要的。

高負載系統(tǒng)的maxIdle值可以設置為與maxActive相同或設置為-1(-1表示不限制),讓連接數(shù)量在minIdle與maxIdle間緩沖慢速波動。

 

timeBetweenEvictionRunsMillis建議設置值

initialSize="5",會在tomcat一啟動時,創(chuàng)建5條連接,效果很理想。

但同時我們還配置了minIdle="10",也就是說,最少要保持10條連接,那現(xiàn)在只有5條連接,哪什么時候再創(chuàng)建少的5條連接呢?

1、等業(yè)務壓力上來了, DBCP就會創(chuàng)建新的連接。

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

 

連接銷毀的邏輯

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

DBCP的連接數(shù)會在  0 - minIdle - maxIdle - maxActive  之間變化。變化的邏輯描述如下:

 

默認未配置initialSize(默認值是0)和timeBetweenEvictionRunsMillis參數(shù)時,剛啟動tomcat時,連接數(shù)是0。當應用有一個并發(fā)訪問數(shù)據(jù)庫時DBCP創(chuàng)建一個連接。

目前連接數(shù)量還未達到minIdle,但DBCP也不自動創(chuàng)建新連接已使數(shù)量達到minIdle數(shù)量(沒有一個獨立的工作線程來檢查和創(chuàng)建)。

隨著應用并發(fā)訪問數(shù)據(jù)庫的增多,連接數(shù)也增多,但都與minIdle值無關,很快minIdle被超越,minIdle值一點用都沒有。

直到連接的數(shù)量達到maxIdle值,這時的連接都是只增不減的。 再繼續(xù)發(fā)展,連接數(shù)再增多并超過maxIdle時,使用完的連接(剛剛空閑下來的)會立即關閉,總體連接的數(shù)量穩(wěn)定在maxIdle但不會超過maxIdle。

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

這時如果應用業(yè)務壓力小了,訪問數(shù)據(jù)庫的并發(fā)少了,連接數(shù)也不會減少(沒有一個獨立的線程來檢查和銷毀),將保持在maxIdle的數(shù)量。

 

默認未配置initialSize(默認值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)參數(shù)時,剛啟動tomcat時,連接數(shù)是0。馬上應用有一個并發(fā)訪問數(shù)據(jù)庫時DBCP創(chuàng)建一個連接。

目前連接數(shù)量還未達到minIdle,每30秒DBCP的工作線程檢查連接數(shù)是否少于minIdle數(shù)量,若少于就創(chuàng)建新連接直到達到minIdle數(shù)量。

隨著應用并發(fā)訪問數(shù)據(jù)庫的增多,連接數(shù)也增多,直到達到maxIdle值。這期間每30秒DBCP的工作線程檢查連接是否空閑了30分鐘,若是就銷毀。但此時是業(yè)務的高峰期,是不會有長達30分鐘的空閑連接的,工作線程查了也是白查,但它在工作。到這里連接數(shù)量一直是呈現(xiàn)增長的趨勢。

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

這時如果應用業(yè)務壓力小了,訪問數(shù)據(jù)庫的并發(fā)少了,每30秒DBCP的工作線程檢查連接(默認每次查3條)是否空閑達到30分鐘(這是默認值),若連接空閑達到30分鐘,就銷毀連接。這時連接數(shù)減少了,呈下降趨勢,將從maxIdle走向minIdle。當小于minIdle值時,則DBCP創(chuàng)建新連接已使數(shù)量穩(wěn)定在minIdle,并進行著新老更替。

 

配置initialSize=“10”時,tomcat一啟動就創(chuàng)建10條連接。其它同上。

 

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

 

 

Tomcat中配置DBCP連接池

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

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

tomcat-dbcp.jar含有commons pool、commons DBCP兩個包的內(nèi)容。但只含有與連接池有關的類。

數(shù)據(jù)源配置在context.xml文件中, 要在tomcat的lib目錄中放jdbc 驅(qū)動包

數(shù)據(jù)源配置在server.xml的host中,不需要在tomcat的lib目錄中放jdbc 驅(qū)動包,只使用工程中的jdbc驅(qū)動包

 

 

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

 

    全局的數(shù)據(jù)源:

    如果需要配置全局的 Resource,則在server.xml的GlobalNamingResources節(jié)點里加入Resource,再在Context節(jié)點里加入ResourceLink的配置。

    全局的resource只是為了重用,方便所有該tomcat下的web工程的數(shù)據(jù)源管理,但如果你的tomcat不會同時加載多個web工程,也就是說一個tomcat只加載一個web工程時,是沒有必要配置全局的resource的。

 

每個web工程一個數(shù)據(jù)源:

在$CATALINA_HOME/conf/context.xml的根節(jié)點Context里加入Resource配置。這種配置方法,你在context.xml配置了一個數(shù)據(jù)源,但Tomcat中有同時運行著5個工程,那了就壞事兒了,這個在Tomcat啟動時數(shù)據(jù)源被創(chuàng)建了5份,每個工程1份數(shù)據(jù)源。連接數(shù)會是你配置的參數(shù)的5倍。

只有在你的Tomcat只加載一個web工程時,才可以直接以context.xml配置數(shù)據(jù)源。

 

               type="javax.sql.DataSource"   //數(shù)據(jù)源類型,使用標準的javax.sql.DataSource

               driverClassName="com.mysql.jdbc.Driver"    //JDBC驅(qū)動器 

               url="jdbc:mysql://localhost:3306/test" //數(shù)據(jù)庫URL地址             

               username="test"     //數(shù)據(jù)庫用戶名

               password="test"   //數(shù)據(jù)庫密碼

               maxIdle="40"   //最大的空閑連接數(shù)

               maxWait="4000" //當池的數(shù)據(jù)庫連接已經(jīng)被占用的時候,最大等待時間

               maxActive="40" //連接池當中最大的數(shù)據(jù)庫連接

               removeAbandoned="true" 

               removeAbandonedTimeout="180"

               logAbandoned="true" //被丟棄的數(shù)據(jù)庫連接是否做記錄,以便跟蹤

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

 

      這里的factory指的是該Resource 配置使用的是哪個數(shù)據(jù)源配置類,這里使用的是tomcat自帶的標準數(shù)據(jù)源Resource配置類,這個類也可以自己寫,實現(xiàn)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節(jié)點中加入:

  

不建議在此文件中,不使用,而使用直接配置數(shù)據(jù)源,原因上面已說明了。   

 

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

 

     

也可在此文件中,不使用,而使用直接配置數(shù)據(jù)源。

 

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

  

          

也可在此文件中,不使用,而使用直接配置數(shù)據(jù)源。

 

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

也可在此文件中,不使用,而使用直接配置數(shù)據(jù)源。

 

 

本文內(nèi)容都在tomcat6.0上運行測試過,還下載了commons DBCP的源碼,加入了跟蹤日志,用于驗證本文的理論。

 

由于commons-dbcp所用的連接池出現(xiàn)版本升級,因此commons-dbcp2中的數(shù)據(jù)庫池連接配置也發(fā)生了變化,具體的參數(shù)配置說明如下:

參數(shù) 描述
username 通過JDBC建立一個連接所需的用戶名
password 通過JDBC建立一個連接所需的密碼
url 通過JDBC建立一個連接所需的URL
driverClassName 所使用的JDBC驅(qū)動的類全名
connectionProperties 連接參數(shù)是在建立一個新連接時發(fā)送給JDBC驅(qū)動的
字符串的格式必須是[參數(shù)名=參數(shù)值;]
提示:用戶名和密碼屬性是需要明確指出的,所以這兩個參數(shù)不需要包含在這里

參數(shù) 缺省值 描述
defaultAutoCommit JDBC驅(qū)動的缺省值 通過這個池創(chuàng)建連接的默認自動提交狀態(tài)。如果不設置,則setAutoCommit 方法將不被調(diào)用。
defaultReadOnly JDBC驅(qū)動的缺省值 通過這個池創(chuàng)建連接的默認只讀狀態(tài)。 如果不設置,則 setReadOnly   方法將不被調(diào)用。(部分驅(qū)動不支持只讀模式,如: Informix )
defaultTransactionIsolation JDBC驅(qū)動的缺省值 通過這個池創(chuàng)建連接的默認事務策略,設置值為下列中的某一個: (參考  javadoc )
  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog
通過這個池創(chuàng)建連接的默認 缺省的 catalog 
cacheState true 如果設置為true,池化的連接將在第一次讀或?qū)?,以及隨后的寫的時候緩存當前的只讀狀態(tài)和自動提交設置。這樣就省去了對getter的任何進一步的調(diào)用時對數(shù)據(jù)庫的額外查詢。如果直接訪問底層連接,只讀狀態(tài)和/或自動提交設置改變緩存值將不會被反映到當前的狀態(tài),在這種情況下,應該將該屬性設置為false以禁用緩存。

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

  提示 : 如果在高負載的系統(tǒng)中將maxIdle的值設置的很低,則你可能會發(fā)現(xiàn)在一個新的連接剛剛被創(chuàng)建的時候就立即被關閉了。這是活躍的線程及時關閉連接要比那些打開連接的線程要快,導致空閑的連接數(shù)大于maxIdle。高負載系統(tǒng)中maxIdle的最合適的配置值是多樣的,但是缺省值是一個好的開始點。


參數(shù) 缺省值 描述
validationQuery
在連接池返回連接給調(diào)用者前用來進行連接校驗的查詢sql。如果指定,則這個查詢必須是一個至少返回一行數(shù)據(jù)的SQL SELECT語句。如果沒有指定,則連接將通過調(diào)用isValid() 方法進行校驗。
testOnCreate false 指明對象在創(chuàng)建后是否需要被校驗,如果對象校驗失敗,則觸發(fā)對象創(chuàng)建的租借嘗試將失敗。
testOnBorrow true 指明在從池中租借對象時是否要進行校驗,如果對象校驗失敗,則對象將從池子釋放,然后我們將嘗試租借另一個
testOnReturn false 指明在將對象歸還給連接池前是否需要校驗。
testWhileIdle false 指明對象是否需要通過對象驅(qū)逐者進行校驗(如果有的話),假如一個對象校驗失敗,則對象將被從池中釋放。
timeBetweenEvictionRunsMillis -1 空閑對象驅(qū)逐線程運行時的休眠毫秒數(shù),如果設置為非正數(shù),則不運行空閑對象驅(qū)逐線程。
numTestsPerEvictionRun 3 在每個空閑對象驅(qū)逐線程運行過程中中進行檢查的對象個數(shù)。(如果有的話)
minEvictableIdleTimeMillis 1000 * 60 * 30 符合對象驅(qū)逐對象驅(qū)逐條件的對象在池中最小空閑毫秒總數(shù) (如果有的話)
softMiniEvictableIdleTimeMillis -1 符合對象驅(qū)逐對象驅(qū)逐條件的對象在池中最小空閑毫秒總數(shù),額外的條件是池中至少保留有 minIdle所指定的個數(shù)的連接。當 miniEvictableIdleTimeMillis 被設置為一個正數(shù),空閑連接驅(qū)逐者首先檢測miniEvictableIdleTimeMillis,當空閑連接被驅(qū)逐者訪問時,首先與miniEvictableIdleTimeMillis 所指定的值進行比較(而不考慮當前池中的空閑連接數(shù)),然后比較softMinEvictableIdleTimeMillis所指定的連接數(shù),包括minIdle條件。
maxConnLifetimeMillis -1 一個連接的最大存活毫秒數(shù)。如果超過這個時間,則連接在下次激活、鈍化、校驗時都將會失敗。如果設置為0或小于0的值,則連接的存活時間是無限的。
connectionInitSqls null 在第一次創(chuàng)建時用來初始化物理連接的SQL語句集合。這些語句只在配置的連接工廠創(chuàng)建連接時被執(zhí)行一次。
lifo true 設置為true表明連接池(如果池中有可用的空閑連接時)將返回最后一次使用的租借對象(最后進入)。設置為false則表明池將表現(xiàn)為FIFO隊列——將會按照它們被歸還的順序 從空閑連接實例池中獲取連接

參數(shù) 缺省值 描述
poolPreparedStatements false 設置該連接池的預處理語句池是否生效
maxOpenPreparedStatements unlimited 可以在語句池中同時分配的最大語句數(shù)。設置為負數(shù)則不限制。

 這個設置同時作用于預處理語句池. 當一個可用的語句池被創(chuàng)建給每一個連接時,通過以下方法創(chuàng)建的預處理語句將被池化。

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

  提示  -要確保你的連接會留下一些資源給其他語句。池化預處理語句可能會在數(shù)據(jù)庫中保持他們的游標,可能會引起連接的游標越界,尤其是maxOpenPreparedStatements的值被設置為默認值(無限的),而且一個應用程序可能會為每個連接打開大量不同的預處理語句。為了避免這個問題maxOpenPreparedStatements應該被設置為一個小于連接可以打開的最大游標數(shù)的值。


參數(shù) 缺省值 描述
accessToUnderlyingConnectionAllowed false 控制PoolGuard是否可以訪問底層連接 

如果允許訪問的話,使用如下代碼結(jié)構(gòu):


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

 默認值為false,這是一個有著潛在風險的操作,使用不當可能會導致非常嚴重的后果。(在守衛(wèi)連接已被關閉的情況下,關閉底層連接或者繼續(xù)使用它),只有在你需要直接訪問驅(qū)動的特有擴展是可以謹慎使用。

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


參數(shù) 缺省值 描述
removeAbandoned false 標記是否刪除超過removeAbandonedTimout所指定時間的 被遺棄的連接。
如果設置為true,則一個連接在超過removeAbandonedTimeout所設定的時間未使用即被認為是應該被拋棄并應該被移除的。創(chuàng)建一個語句,預處理語句,可調(diào)用語句或使用它們其中的一個執(zhí)行查詢(使用執(zhí)行方法中的某一個)會重新設置其父連接的lastUsed 屬性。
在寫操作較少的應用程序中將該參數(shù)設置為true可以將數(shù)據(jù)庫連接從連接關閉失敗中恢復。
removeAbandonedTimeout 300 一個被拋棄連接可以被移除的超時時間,單位為秒
logAbandoned false 標志是否為應用程序中遺棄語句或連接的代碼開啟日志堆棧追蹤。
因為一個堆棧跟蹤已被創(chuàng)建,被拋棄的語句和連接相關的日志將被覆蓋到打開每個連接或者創(chuàng)建一個Statement時

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

 例如, maxTotal=20 ,這里有18個活躍連接,一個限制連接,將觸發(fā) "removeAbandoned"。但是只有在活動連接超過 "removeAbandonedTimeout" 所指定的秒數(shù)內(nèi)未使用才會被刪除(默認為300秒)。遍歷一個結(jié)果集并不被統(tǒng)計為被使用,創(chuàng)建一個語句,預處理語句,可調(diào)用語句或使用它們其中的一個執(zhí)行查詢(使用執(zhí)行方法中的某一個)會重新設置其父連接的lastUsed 屬性


名稱欄目:tomcat自帶連接池dbcp配置以及優(yōu)化說明
分享路徑:http://weahome.cn/article/jjdeis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部