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代表每次在数据库连接池上调用方法是,连接池都会记录调用的堆栈信息。

猜你喜欢

转载自my.oschina.net/u/2457218/blog/1858407