学习《精通Spring+4.x++企业应用开发实战》 记录笔记,以备以后使用。
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池。
“8小时问题”:MySQL在默认情况下如果发现一个连接的空闲时间超过8小时,则将会在数据库端自动关闭这个连接。
数据源不知道,还是会将这个无用的连接返回给某个DAO,DAO会报出无法获取Connection的异常。
DBCP参数:
分类 | 属性 | 默认值 | 说明 |
事务属性 | defaultAutoCommit | true | 连接池创建的连接的默认auto-commit状态 |
defaultReadOnly | 驱动默认 | 连接池创建的连接的默认read-only状态。 如果没有设置,则setReadOnly()方法将不会被调用 | |
defaultTransactionIsolation | 驱动默认 | 连接池创建的连接的默认的TransactionIsolation状态,可选值包括:NONE、 READ_COMMITTED、READ_UNCOMMITTED、 REPEATABLE_READ和SERIALIZABLE | |
数据源连接数量 | initialSize | 0 | 初始化连接: 连接池启动时创建的初始化连接数量 |
maxActive | 8 | 最大活动连接: 连接池在同一时间能够分配的最大活动连接数量。 若设为非正数则表示不限制。 | |
maxIdle | 8 | 最大空闲连接: 连接池中允许保持空闲状态的最大连接数量,超过的空闲连接将被释放。 若设为负数,则表示不限制。 | |
minIdle | 0 | 最小空闲连接: 连接池中允许保持空闲状态的最小连接数量,低于这个数量将创建新的连接。 若为0,则不创建。 | |
maxWait | 无限 | 最大等待时机: 当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数) 超过时间则抛出异常 若设为-1,则表示无限等待 | |
连接健康情况维护和检测 | validationQuery | 无默认值 | SQL查询语句。 在将连接返回给调用者之前,用此SQL验证从连接池取出的连接是否可用。若指定,则查询必须是一个SQL SELECT,并且必须返回至少一行记录。在MySQL中可以设置为“select 1”,在Oracle中可以设置为“select 1 from dual” |
testOnBorrow | true | 指明是否在从连接池中取出连接前进行检验,如果检验失败,则从连接池中去除该连接并尝试取出另一个新的连接。 注意:设为true后如果要生效,则validationQuery参数必须正确设置 | |
testOnReturn | false | 指明是否在归还到连接池中起岸进行检验。 注意:设为true后如果要生效,则validationQuery参数必须正确设置 | |
testWhileIdle | false | 指明连接是否被空闲连接回收器(若有)进行检验。 注意:设为true后如果要生效,则validationQuery参数必须正确设置 | |
timeBetweenEvictionRunsMillis | -1 | 空闲连接回收器线程运行的周期。 单位:毫秒 若为非正数,则不运行空闲连接回收器线程。 注意:设为true后如果要生效,则validationQuery参数必须正确设置 | |
numTestsPerEvictionRun | 3 | 在每次空闲连接回收器线程(若有)运行时检查的连接数量 | |
minEvictableIdleTimeMillis | 1000*60*30 | 连接在可被空闲连接回收前已经在连接池中的空闲时间 单位:毫秒 | |
缓存语句 | poolPreparedStatements | false | 开启连接池的prepared statement池功能。 当设为true时,所有CallableStatement和PreparedStatemen都会被缓存起来 |
maxOpenPreparedStatements | 无限制 | PreparedStatement池能够同时分配的打开的statements的最大数量。 若设为0,则表示不限制 | |
连接泄露回收 | removeAbandoned | false | 标记是否删除泄露的连接。 如果removeAbandoned设置为true,那么“存在泄露嫌疑”的连接可能被连接池主动清除,这个机制在(getNumIdle()<2) and (getNumActive()>getMaxActive()-3)条件满足时被触发。举例来说:当maxActive=20,活动连接为18,空闲连接为1时,可以触发removeAbandoned动作。 但是活动连接只有在未被使用的时间超过removeAbandonedTimeout时才被回收,默认为300秒。若应用需要一个进行长时间操作的连接,则需要考虑将removeAbandonedTimeout设置得更长一些,否则可能发生正常连接被强制清除的情况 |
removeAbandonedTimeout | 300 | 泄露的连接可以回收的超时值 单位:秒 | |
logAbandoned | false | 标记当Statement或连接被泄露时是否打印工程的stack traces日志。被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,因为需要生成stack trace。 |
testOnBorrow默认为true,在高并发的应用中将会带来性能问题。
高效方式:将testOnBorrow设置为false,testWhileIdle设置为true,再设置timeBetweenEvictionRunsMillis.