龙空技术网

聊聊druid连接池的参数配置

码匠乱炖 79

前言:

目前兄弟们对“apache pool2创建socket连接池”都比较着重,兄弟们都需要学习一些“apache pool2创建socket连接池”的相关知识。那么小编同时在网上收集了一些关于“apache pool2创建socket连接池””的相关内容,希望咱们能喜欢,咱们快快来学习一下吧!

本文主要研究一下druid连接池的参数配置

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常量定义了所有支持的可配置项

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的时候会使用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等几个配置,其它大部分配置在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定义的配置及其默认值如下

类别

配置项

默认值

说明

数量

initialSize

0

-

数量

maxActive

8

-

数量

minIdle

0

-

数量

maxIdle

8

-

数量

maxPoolPreparedStatementPerConnectionSize

10

-

健康检测

validationQuery

null

mysql默认为SELECT 1

健康检测

validationQueryTimeout

-1

单位秒,mysql默认1s

健康检测

testOnBorrow

false

-

健康检测

testOnReturn

false

-

健康检测

testOnReturn

false

-

健康检测

testWhileIdle

true

-

evict

timeBetweenEvictionRunsMillis

60s

-

evict

numTestsPerEvictionRun

3

-

evict

minEvictableIdleTimeMillis

30分钟

-

evict

maxEvictableIdleTimeMillis

7小时

-

超时

maxWait

-1

单位毫秒

超时

keepAliveBetweenTimeMillis

120s

2* DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS

超时

phyTimeoutMillis

-1

-

超时

queryTimeout

0

-

超时

transactionQueryTimeout

0

-

错误

timeBetweenConnectErrorMillis

500ms

-

连接泄露

removeAbandoned

false

-

连接泄露

removeAbandonedTimeoutMillis

300s

-

获取连接时,若maxWait大于0则走的pollLast(nanos),其中maxWait是作为notEmpty.awaitNanos参数,毫秒转为nacos,若为负数则取0;若maxWait小于等于0则走的takeLast,执行的是notEmpty.await(),即阻塞等待

小结

druid连接池的配置主要是在DruidDataSource中,而DruidDataSource继承了DruidAbstractDataSource,它只定义了keepAlive、asyncInit等几个配置,其它大部分配置在DruidAbstractDataSource中,没有单独的一个配置类,然后默认只开启了testWhileIdle,maxWait默认为-1;因而建议强制配置maxWait为正数(单位毫秒);在并发量比较大的场景,若要保证连接池的稳定数量则可以将minIdle配置为与maxIdle一样。

标签: #apache pool2创建socket连接池