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 | 預設隔離級別,預設是資料庫的隔離級別,目前支援以下幾種設定
|
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代表每次在資料庫連線池上呼叫方法是,連線池都會記錄呼叫的堆疊資訊。 |