DBCP連接池參數詳解-2.4.0版本 原

BasicDataSource 配置參數

這些配置均在dbcp源碼的BasicDataSource類的createPoolableConnectionFactory方法中使用和初始化。具體代碼如下:

protected PoolableConnectionFactory createPoolableConnectionFactory(final ConnectionFactory driverConnectionFactory)
        throws SQLException {
    PoolableConnectionFactory connectionFactory = null;
    try {
        connectionFactory = new PoolableConnectionFactory(driverConnectionFactory,
                ObjectNameWrapper.unwrap(registeredJmxObjectName));
        connectionFactory.setValidationQuery(validationQuery);
        connectionFactory.setValidationQueryTimeout(validationQueryTimeoutSeconds);
        connectionFactory.setConnectionInitSql(connectionInitSqls);
        connectionFactory.setDefaultReadOnly(defaultReadOnly);
        connectionFactory.setDefaultAutoCommit(defaultAutoCommit);
        connectionFactory.setDefaultTransactionIsolation(defaultTransactionIsolation);
        connectionFactory.setDefaultCatalog(defaultCatalog);
        connectionFactory.setCacheState(cacheState);
        connectionFactory.setPoolStatements(poolPreparedStatements);
        connectionFactory.setMaxOpenPreparedStatements(maxOpenPreparedStatements);
        connectionFactory.setMaxConnLifetimeMillis(maxConnLifetimeMillis);
        connectionFactory.setRollbackOnReturn(getRollbackOnReturn());
        connectionFactory.setEnableAutoCommitOnReturn(getEnableAutoCommitOnReturn());
        connectionFactory.setDefaultQueryTimeout(getDefaultQueryTimeout());
        connectionFactory.setFastFailValidation(fastFailValidation);
        connectionFactory.setDisconnectionSqlCodes(disconnectionSqlCodes);
        validateConnectionFactory(connectionFactory);
    } catch (final RuntimeException e) {
        throw e;
    } catch (final Exception e) {
        throw new SQLException("Cannot create PoolableConnectionFactory (" + e.getMessage() + ")", e);
    }
    return connectionFactory;
}

接下來就是對這些配置的說明:

連接配置

參數  說明
username 數據庫連接的用戶名
password 數據庫連接的密碼
url 數據庫連接的url
driverClassName 驅動類名,就是我們用jdbc連接的時候 class.forName使用的類
connectionProperties 數據庫連接的屬性,通常我們在數據庫連接的時候,後面會設置一些屬性,例如用戶名,密碼,連接的數據庫,用的字符集等,由於數據庫的用戶名和密碼太常見,所以就單獨的拉出來作爲單獨屬性了

 

提交屬性

參數 默認值 描述
defaultAutoCommit driverdefault

默認的SQL語句自動提交狀態,由driver本身所決定,這個是數據庫驅動默認值,

如果沒有設置,則此方法不會被調用

defaultReadOnly     driverdefault

設置默認的是否是隻讀模式,由driver本身所決定,沒有被設置的話則此方法不

會被調用,但是有些數據庫是不支持此模式的 例如,infomix

defaultTransactionIsolation driverdefault

默認隔離級別,默認是數據庫的隔離級別,目前支持以下幾種設置

  • NONE
  • READ_COMMITED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog   連接遲創建的默認catalog 【**不知道是幹嘛的,誰知道可以告知一下】
cacheState true

如果是true,連接將會在第一次讀和寫的時候把當前的readOnly和autoCommit

設置進行緩存,然後在接下來的寫操作中使用。這樣的話就消除了調用getter時

的額外查詢,但是如果直接訪問數據庫連接,則會出現不一致狀態,這時候就需

要把這個值設置false

defaultQueryTimeout     null

默認查詢超時時間,null代表的是數據庫驅動默認的超時時間,設置時,整形,

毫秒數

enableAutoCommitOnReturn true

true,連接返回時,如果自動提交設置爲false ,則將使用

Connection.setAutoCommit(true)進行檢查並配置,然後返還到連接池中。                                                                

rollbackOnReturn true

如果autoCommit=false,那麼當連接返還給連接池時,會在連接上調用

回滾方法,從之終止事務

連接屬性

參數 默認值 描述
initialSize 0 初始化連接數
maxTotal 8 能從數據庫連接池中申請到的最大連接數,設置爲負值則無限制
maxIdle 8 最大空閒數,負值則無限制
minIdle 0 最小空閒數。
maxWaitMills indefinitely 從連接池中獲取連接時最大的等待毫秒數,超過以後會拋出異常,設置爲-1,則無限等待 

注意⚠️:如果maxIdle設置的太小,當應用的負載比較高時,連接數會很快的超過maxIdle,但是應用使用完以後會立即被回收,但是此時應用負載依然很高,應用會再此申請連接,這時候連接數️會超過maxIdle,但是會永遠小於maxTotal,出現這種情況會連接會一直被創建然後銷燬,來來回回往往復復,連接數就會在maxIdle上下來回震盪。針對負載比較高的應用,最好設置maxIdle接近於maxTotal,例如設置的數量爲maxTotal-1甚至等於maxTotal,或者無限制。

連接檢測

參數 默認值 描述
validationQuery   測試數據庫連接的字符串,例如要驗證數據庫連接是否正常,這個字符串通常我們會寫作 “SELECT 1”,查詢必須至少返回一條記錄
validationQueryTimeout no timeout 驗證的連接時的超時時間。根據文檔裏面說的,這個單位貌似爲。設置爲負值的話,則這個超時時間則跟隨setQueryTimeOut 方法設定的時間
testOnCreate false 創建連接時,是否執行validationQuery,如果驗證失敗,則連接的創建也失敗
testOnBorrow true 從數據庫連接池中獲取連接時,進行校驗,校驗失敗的話,則把此連接從連接池中刪除,然後嘗試獲取另一個
testOnReturn false 把連接歸還給數據庫連接池中是否進行校驗
testWhileIdle false 連接是否被空閒回收器回收進行檢驗,如果檢測失敗,則從數據庫連接池中刪除掉
timeBetweenEvictionRunsMills -1 空閒回收器執行的間隔時間
numTestsPerEvictionRun 3 空閒回收器每次回收的線程數,之所以不是一下子回收,是爲了有一個緩慢回收的過程。這樣將會有一個下降的趨勢。
minEvictableIdleTimeMills 1000*60*30 連接保持空閒,但是不被空閒回收器回收的最小時間值,但是是毫秒,達到此時間,連接可能會被移除
softMinEvctqbleIdleTimeMillis -1

連接保持的空閒時間,達到此值後,空閒連接將會被移除。並且保留“minIdle”個空閒連接數。默認值爲-1。當MinEvictableIdleTimeMills設置爲正值,minEvictableIdleTimeMills首先會被空閒移除器檢查,當空閒移除器訪問連接時,首先將空閒時間和minEvictableIdleTimeMills進行比較(不考慮數據庫連接池中空閒連接的數量),然後再針對softMinEvctqbleIdleTimeMillis設置的線程進行時間比較。

maxConnLifetimeMills -1 一個連接的生命時常。超過這個時長之後,連接將無法使用。0或者負值標示生命無限。
logExpiredConnections true 當連接由於設置maxConnLifetimeMills而被回收後,記錄日誌。
connectionInitSqls null 再配置初始化時,首次進行物理連接時執行的sql語句,這些語句只執行一次。
lifo true

這個設置標示如何從數據庫連接池中獲取連接:

true:表示一個LIFO,也就是後進先出的一個隊列

false:表示FIFO,先進先出的一個隊列,這些設置會影響到連接線程的回收順序。

連接移除

參數 默認值 描述
removeAbandonedTimeout 300 廢棄連接刪除之前的超時(秒爲單位)時間

removeAbandonedOnMaintenacne

removeAbandonedBorrow

false

廢棄連接如果超過removeAbandonedTimeout,就進行標記,這個連接將會被標記爲不再使用。創建一個startement,PreparedStatement或者CallableStatement,或者其他的任何使用execute的方法,將會重置負連接的lastUsed屬性。

當removeAbandonedOnMaintenacne設置爲true時,可以刪除維護週期中的廢棄的連接。這個屬性需要和timeBetweenEvictionRunsMills屬性配合使用,只有當timeBetweenEvictionRunsMills爲正值時纔有作用。

removeAbandonedBorrow爲true,則每次從連接池中拿連接時都會刪除廢棄的連接。限制如下:

getNumActive()> getMaxTotal()-3 and getNumIdle()<2

logAbandoned false 標記爲廢棄連接時記錄日誌。
abandonedUsageTracking false 這個設置爲true會增加開銷。true代表每次在數據庫連接池上調用方法是,連接池都會記錄調用的堆棧信息。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章