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