druid連接池的參數(shù)配置示例全面解析
序
本文主要研究一下druid連接池的參數(shù)配置
DruidDataSourceFactory
druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidDataSourceFactory.java
public class DruidDataSourceFactory implements ObjectFactory {
private static final Log LOG = LogFactory.getLog(DruidDataSourceFactory.class);
static final int UNKNOWN_TRANSACTIONISOLATION = -1;
public static final String PROP_DEFAULTAUTOCOMMIT = "defaultAutoCommit";
public static final String PROP_DEFAULTREADONLY = "defaultReadOnly";
public static final String PROP_DEFAULTTRANSACTIONISOLATION = "defaultTransactionIsolation";
public static final String PROP_DEFAULTCATALOG = "defaultCatalog";
public static final String PROP_DRIVERCLASSNAME = "driverClassName";
public static final String PROP_MAXACTIVE = "maxActive";
public static final String PROP_MAXIDLE = "maxIdle";
public static final String PROP_MINIDLE = "minIdle";
public static final String PROP_INITIALSIZE = "initialSize";
public static final String PROP_MAXWAIT = "maxWait";
public static final String PROP_TESTONBORROW = "testOnBorrow";
public static final String PROP_TESTONRETURN = "testOnReturn";
public static final String PROP_TIMEBETWEENEVICTIONRUNSMILLIS = "timeBetweenEvictionRunsMillis";
public static final String PROP_NUMTESTSPEREVICTIONRUN = "numTestsPerEvictionRun";
public static final String PROP_MINEVICTABLEIDLETIMEMILLIS = "minEvictableIdleTimeMillis";
public static final String PROP_PHY_TIMEOUT_MILLIS = "phyTimeoutMillis";
public static final String PROP_TESTWHILEIDLE = "testWhileIdle";
public static final String PROP_PASSWORD = "password";
public static final String PROP_URL = "url";
public static final String PROP_USERNAME = "username";
public static final String PROP_VALIDATIONQUERY = "validationQuery";
public static final String PROP_VALIDATIONQUERY_TIMEOUT = "validationQueryTimeout";
public static final String PROP_INITCONNECTIONSQLS = "initConnectionSqls";
public static final String PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED = "accessToUnderlyingConnectionAllowed";
public static final String PROP_REMOVEABANDONED = "removeAbandoned";
public static final String PROP_REMOVEABANDONEDTIMEOUT = "removeAbandonedTimeout";
public static final String PROP_LOGABANDONED = "logAbandoned";
public static final String PROP_POOLPREPAREDSTATEMENTS = "poolPreparedStatements";
public static final String PROP_MAXOPENPREPAREDSTATEMENTS = "maxOpenPreparedStatements";
public static final String PROP_CONNECTIONPROPERTIES = "connectionProperties";
public static final String PROP_FILTERS = "filters";
public static final String PROP_EXCEPTION_SORTER = "exceptionSorter";
public static final String PROP_EXCEPTION_SORTER_CLASS_NAME = "exception-sorter-class-name";
public static final String PROP_NAME = "name";
public static final String PROP_INIT = "init";
private static final String[] ALL_PROPERTIES = {
PROP_DEFAULTAUTOCOMMIT,
PROP_DEFAULTREADONLY,
PROP_DEFAULTTRANSACTIONISOLATION,
PROP_DEFAULTCATALOG,
PROP_DRIVERCLASSNAME,
PROP_MAXACTIVE,
PROP_MAXIDLE,
PROP_MINIDLE,
PROP_INITIALSIZE,
PROP_MAXWAIT,
PROP_TESTONBORROW,
PROP_TESTONRETURN,
PROP_TIMEBETWEENEVICTIONRUNSMILLIS,
PROP_NUMTESTSPEREVICTIONRUN,
PROP_MINEVICTABLEIDLETIMEMILLIS,
PROP_TESTWHILEIDLE,
PROP_PASSWORD,
PROP_FILTERS,
PROP_URL,
PROP_USERNAME,
PROP_VALIDATIONQUERY,
PROP_VALIDATIONQUERY_TIMEOUT,
PROP_INITCONNECTIONSQLS,
PROP_ACCESSTOUNDERLYINGCONNECTIONALLOWED,
PROP_REMOVEABANDONED,
PROP_REMOVEABANDONEDTIMEOUT,
PROP_LOGABANDONED,
PROP_POOLPREPAREDSTATEMENTS,
PROP_MAXOPENPREPAREDSTATEMENTS,
PROP_CONNECTIONPROPERTIES,
PROP_EXCEPTION_SORTER,
PROP_EXCEPTION_SORTER_CLASS_NAME,
PROP_INIT,
PROP_NAME,
"druid.timeBetweenLogStatsMillis",
"druid.stat.sql.MaxSize",
"druid.clearFiltersEnable",
"druid.resetStatEnable", //
"druid.notFullTimeoutRetryCount", //
"druid.maxWaitThreadCount", //
"druid.failFast", //
"druid.phyTimeoutMillis", //
"druid.wall.tenantColumn", //
"druid.wall.updateAllow", //
"druid.wall.deleteAllow", //
"druid.wall.insertAllow", //
"druid.wall.selelctAllow", //
"druid.wall.multiStatementAllow", //
};
//......
}DruidDataSourceFactory的ALL_PROPERTIES常量定義了所有支持的可配置項(xiàng)
DruidDataSourceWrapper
com/alibaba/druid/spring/boot/autoconfigure/DruidDataSourceWrapper.java
@ConfigurationProperties("spring.datasource.druid")
public class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {
@Autowired
private DataSourceProperties basicProperties;
@Override
public void afterPropertiesSet() throws Exception {
//if not found prefix 'spring.datasource.druid' jdbc properties ,'spring.datasource' prefix jdbc properties will be used.
if (super.getUsername() == null) {
super.setUsername(basicProperties.determineUsername());
}
if (super.getPassword() == null) {
super.setPassword(basicProperties.determinePassword());
}
if (super.getUrl() == null) {
super.setUrl(basicProperties.determineUrl());
}
if (super.getDriverClassName() == null) {
super.setDriverClassName(basicProperties.getDriverClassName());
}
}
@Autowired(required = false)
public void autoAddFilters(List<Filter> filters){
super.filters.addAll(filters);
}
/**
* Ignore the 'maxEvictableIdleTimeMillis < minEvictableIdleTimeMillis' validate,
* it will be validated again in {@link DruidDataSource#init()}.
*
* for fix issue #3084, #2763
*
* @since 1.1.14
*/
@Override
public void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis) {
try {
super.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
} catch (IllegalArgumentException ignore) {
super.maxEvictableIdleTimeMillis = maxEvictableIdleTimeMillis;
}
}
}DruidDataSourceWrapper繼承了DruidDataSource,在afterPropertiesSet的時(shí)候會(huì)使用DataSourceProperties的username、password、url、driverClassName,其他配置在DruidDataSource中
DruidDataSource
com/alibaba/druid/pool/DruidDataSource.java
public class DruidDataSource extends DruidAbstractDataSource implements DruidDataSourceMBean, ManagedDataSource, Referenceable, Closeable, Cloneable, ConnectionPoolDataSource, MBeanRegistration {
private boolean useGlobalDataSourceStat = false;
private boolean logDifferentThread = true;
private volatile boolean keepAlive = false;
private boolean asyncInit = false;
protected boolean killWhenSocketReadTimeout = false;
protected boolean checkExecuteTime = false;
}DruidDataSource繼承了DruidAbstractDataSource,它只定義了keepAlive、asyncInit等幾個(gè)配置,其它大部分配置在DruidAbstractDataSource中
DruidAbstractDataSource
com/alibaba/druid/pool/DruidAbstractDataSource.java
public abstract class DruidAbstractDataSource extends WrapperAdapter implements DruidAbstractDataSourceMBean, DataSource, DataSourceProxy, Serializable {
protected volatile int initialSize = DEFAULT_INITIAL_SIZE;
public static final int DEFAULT_INITIAL_SIZE = 0;
protected volatile int maxActive = DEFAULT_MAX_ACTIVE_SIZE;
public static final int DEFAULT_MAX_ACTIVE_SIZE = 8;
protected volatile int minIdle = DEFAULT_MIN_IDLE;
public static final int DEFAULT_MIN_IDLE = 0;
protected volatile int maxIdle = DEFAULT_MAX_IDLE;
public static final int DEFAULT_MAX_IDLE = 8;
protected volatile long maxWait = DEFAULT_MAX_WAIT;
public static final int DEFAULT_MAX_WAIT = -1;
protected volatile String validationQuery = DEFAULT_VALIDATION_QUERY;
public static final String DEFAULT_VALIDATION_QUERY = null;
protected volatile int validationQueryTimeout = -1;
protected volatile boolean testOnBorrow = DEFAULT_TEST_ON_BORROW;
public static final boolean DEFAULT_TEST_ON_BORROW = false;
protected volatile boolean testOnReturn = DEFAULT_TEST_ON_RETURN;
public static final boolean DEFAULT_TEST_ON_RETURN = false;
protected volatile boolean testWhileIdle = DEFAULT_WHILE_IDLE;
public static final boolean DEFAULT_WHILE_IDLE = true;
protected volatile int maxPoolPreparedStatementPerConnectionSize = 10;
protected volatile long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = 60 * 1000L;
protected volatile int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3;
protected volatile long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
public static final long DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 30L;
protected volatile long maxEvictableIdleTimeMillis = DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS;
public static final long DEFAULT_MAX_EVICTABLE_IDLE_TIME_MILLIS = 1000L * 60L * 60L * 7;
protected volatile long keepAliveBetweenTimeMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS * 2;
protected volatile long phyTimeoutMillis = DEFAULT_PHY_TIMEOUT_MILLIS;
public static final long DEFAULT_PHY_TIMEOUT_MILLIS = -1;
protected volatile long timeBetweenConnectErrorMillis = DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS;
public static final long DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS = 500;
}DruidAbstractDataSource定義的配置及其默認(rèn)值如下
| 類別 | 配置項(xiàng) | 默認(rèn)值 | 說明 |
|---|---|---|---|
| 數(shù)量 | initialSize | 0 | - |
| 數(shù)量 | maxActive | 8 | - |
| 數(shù)量 | minIdle | 0 | - |
| 數(shù)量 | maxIdle | 8 | - |
| 數(shù)量 | maxPoolPreparedStatementPerConnectionSize | 10 | - |
| 健康檢測(cè) | validationQuery | null | mysql默認(rèn)為SELECT 1 |
| 健康檢測(cè) | validationQueryTimeout | -1 | 單位秒,mysql默認(rèn)1s |
| 健康檢測(cè) | testOnBorrow | false | - |
| 健康檢測(cè) | testOnReturn | false | - |
| 健康檢測(cè) | testOnReturn | false | - |
| 健康檢測(cè) | testWhileIdle | true | - |
| evict | timeBetweenEvictionRunsMillis | 60s | - |
| evict | numTestsPerEvictionRun | 3 | - |
| evict | minEvictableIdleTimeMillis | 30分鐘 | - |
| evict | maxEvictableIdleTimeMillis | 7小時(shí) | - |
| 超時(shí) | maxWait | -1 | 單位毫秒 |
| 超時(shí) | keepAliveBetweenTimeMillis | 120s | 2* DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS |
| 超時(shí) | phyTimeoutMillis | -1 | - |
| 超時(shí) | queryTimeout | 0 | - |
| 超時(shí) | transactionQueryTimeout | 0 | - |
| 錯(cuò)誤 | timeBetweenConnectErrorMillis | 500ms | - |
| 連接泄露 | removeAbandoned | false | - |
| 連接泄露 | removeAbandonedTimeoutMillis | 300s | - |
獲取連接時(shí),若maxWait大于0則走的pollLast(nanos),其中maxWait是作為notEmpty.awaitNanos參數(shù),毫秒轉(zhuǎn)為nacos,若為負(fù)數(shù)則取0;若maxWait小于等于0則走的takeLast,執(zhí)行的是notEmpty.await(),即阻塞等待
小結(jié)
druid連接池的配置主要是在DruidDataSource中,而DruidDataSource繼承了DruidAbstractDataSource,它只定義了keepAlive、asyncInit等幾個(gè)配置,其它大部分配置在DruidAbstractDataSource中,沒有單獨(dú)的一個(gè)配置類,然后默認(rèn)只開啟了testWhileIdle,maxWait默認(rèn)為-1;因而建議強(qiáng)制配置maxWait為正數(shù)(單位毫秒);在并發(fā)量比較大的場(chǎng)景,若要保證連接池的穩(wěn)定數(shù)量則可以將minIdle配置為與maxIdle一樣。
以上就是druid連接池的參數(shù)配置示例全面解析的詳細(xì)內(nèi)容,更多關(guān)于druid連接池參數(shù)配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java設(shè)計(jì)模式中組合模式應(yīng)用詳解
組合模式,又叫部分整體模式,它創(chuàng)建了對(duì)象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的訪問具有一致性。本文將通過示例為大家詳細(xì)介紹一下組合模式,需要的可以參考一下2022-11-11
springboot+dubbo+validation 進(jìn)行rpc參數(shù)校驗(yàn)的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot+dubbo+validation 進(jìn)行rpc參數(shù)校驗(yàn)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
在 Spring Boot 3 中接入生成式 AI的操作方法
本文介紹了如何在SpringBoot3中集成生成式AI,以O(shè)penAI的GPT模型為例,通過代碼示例展示了如何實(shí)現(xiàn),SpringBoot3的優(yōu)勢(shì)和OpenAI的生成式AI技術(shù)結(jié)合,為開發(fā)者提供了高效集成生成式AI的方法,感興趣的朋友跟隨小編一起看看吧2025-01-01
springboot如何實(shí)現(xiàn)前后端分離跨域訪問
這篇文章主要介紹了springboot如何實(shí)現(xiàn)前后端分離跨域訪問問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

