BasicDataSource 配置參數sql
這些配置均在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; }
接下來就是對這些配置的說明:緩存
鏈接配置app
參數 | 說明 |
---|---|
username | 數據庫鏈接的用戶名 |
password | 數據庫鏈接的密碼 |
url | 數據庫鏈接的url |
driverClassName | 驅動類名,就是咱們用jdbc鏈接的時候 class.forName使用的類 |
connectionProperties | 數據庫鏈接的屬性,一般咱們在數據庫鏈接的時候,後面會設置一些屬性,例如用戶名,密碼,鏈接的數據庫,用的字符集等,因爲數據庫的用戶名和密碼太常見,因此就單獨的拉出來做爲單獨屬性了 |
提交屬性測試
參數 | 默認值 | 描述 |
---|---|---|
defaultAutoCommit | driverdefault | 默認的SQL語句自動提交狀態,由driver自己所決定,這個是數據庫驅動默認值,url 若是沒有設置,則此方法不會被調用spa |
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表明每次在數據庫鏈接池上調用方法是,鏈接池都會記錄調用的堆棧信息。 |