使用 DataSource 对象的优点
便携性,可维护性强
连接数据库的必要信息,如 url 等不必硬编码在代码中,可以直接通过 properties 文件进行设置和更新
DataSource 可以实现为支持数据库连接池、支持分布式事务(Distributed Transactions)
Tomcat JDBC
Config Property | Default Value | Description |
---|---|---|
maxIdle | 100 | 如果 isPoolSweeperEnabled() 返回 false,空闲池(idle pool)中应该保持的最大连接数。 |
minIdle | 10 | 任何时间,连接池中应该保持的已建立连接的最小数目。连接池中连接的数目可能会小于这个数字(由于验证查询失败或者连接被关闭),在清理程序运行时(during an evicition), 不会小于这个数字,介于 getMindle 和 getMaxIdle/getMaxActive 之间i |
maxActive | 100 | 连接池中同一时间可以分配的最大活跃连接数 |
timeBetweenEvictionRunsMillis | 5000 (5秒) | 空闲连接验证(idle connection validation)、弃用连接清理程序(abandoned cleaner)、idle pool resizing 运行的时间间隔(number of milliseconds to sleep) |
initialSize | 10 | 当启动连接池时,要建立的初始连接数,如果超过了 maxActive, 会自动减小这个数字 |
testWhileIdle | false | 期望连接处于空闲(idle)时,能够对其通过查询验证有效性的话,将其设置为 true |
testOnBorrow | false | 表示从连接池获取连接之前,是否要对其进行验证。如果验证失败,该连接会被连接池丢弃(dropped from pool),并尝试重新获取连接。如果设置为 true 要生效的话,validationQuery 参数必须非空。为了提升性能, 默认 false。请参考 validationInterval 参数 |
validationInterval | 3000(3秒) | 为了避免频繁进行验证,如果连接应进行验证,但之前已在此时间间隔内已进行验证,则不会再次对其进行验证。 |
validationQuery | 连接池用来对连接进行验证的 SQL 查询语句,这个查询不需要返回任何数据,例如: SELECT 1(mysql), select 1 from dual(oracle), SELECT 1(MS Sql Server) | |
validationQueryTimeout | -1 | 连接验证查询失败前的超时时间 (The timeout in seconds before a connection validation queries fail),-1 表示不启用该特性 |
removeAbandoned | false | 表示如果 abandoned connections 超过了 removeAbandonedTimout 的值,是否要移除这些连接。如果设置为true,则如果连接的使用时间超过了getRemoveAbandonedTimeout()并且满足了getAbandonWhenPercentageFull()的条件,则认为该连接已被放弃并可以删除。 将此设置为true可以从无法关闭连接的应用程序恢复数据库连接。 另请参见isLogAbandoned()缺省值为false |
removeAbandonedTimeout | 60 s | 如果一个连接使用超过了该时间,被认为是被弃用 (abandoned) 的连接。可以使用拦截器在查询后重置计时器。 |
abandonWhenPercentageFull | 0 | 只有使用中的连接超过了该参数定义的百分比,被弃用的连接(abandoned/timed out)才会被关闭和报告。默认为0,表示只要连接超过了 removeAbandonedTimeout 的值,就可以关闭该连接 |
maxWait | 30000(30秒) | 当连接池中的连接数已经达到 maxActive,没有可用的连接时,连接池等待的超时时间,超过了该时间,就会抛出异常 |
minEvictableIdleTimeMillis | 60000 (60 秒) | 当连接处于空闲的时间超过了该值,才可以移除(eligible for eviction) |
isPoolSweeperEnabled 如果连接池启用了 pool sweeper,返回 true
result = getTimeBetweenEvictionRunsMillis()>0;
result = result && (isRemoveAbandoned() && getRemoveAbandonedTimeout()>0);
result = result || (isTestWhileIdle() && getValidationQuery()!=null);
return result;
timeBetweenEvictionRunsMillis 参数涉及的三个方面
1. 空闲连接验证(idle connection validation)
对连接池中的空闲连接进行验证,如果验证失败,则丢弃该连接,参考 testWhileIdle,validationQuery,validationInterval,timeBetweenEvictionRunsMillis
**
**
2. 启用清理程序(abandoned cleaner)
对连接池中 abandoned connection 进行清理,参考 removeAbandoned,removeAbandonedTimeout,abandonWhenPercentageFull
**
**
3. 连接池大小调整 (idle pool resizing )
当连接池中的空闲连接空闲时间超过一定值时,可以被清理,最终保持连接池中的空闲连接至少为 minIdle, 参考 minIdle, minEvictableIdleTimeMillis
凡是有校验的机制,如 testOnBorrow, testOnReturn, testWhileIdle ,都使用 validationQuery 查询语句,受限于 validationInterval 参数,也就是限制对一个连接进行验证的频率,如同时设置了 testOnBorrow, testOnReturn, 在从连接池中取出连接时,会对该连接进行验证,使用并返回时(时间很短),期间的时间间隔如果小于 validationInterval ,是不会再次进行验证的。避免频繁进行验证,影响性能。
maxIdle
如果 isPoolSweeperEnabled() 返回 false,空闲池(idle pool)中应该保持的最大连接数。也就是空闲的连接数不会超过该数目,但是如果 isPoolSweeperEnabled 返回 true, 也就是启用了清理程序,最大的空闲连接数是可以达到 maxActive 的,且可以根据 getMinEvictableIdleTimeMillis() 的设置,逐渐减少,参考 minEvictableIdleTimeMillis 参数设置