Tomcat-Jdbc-Pool参数说明

<!-- 数据源配置, 使用Tomcat JDBC连接池 -->
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- Connection Pooling Info -->
        <property name="maxActive" value="${jdbc.pool.maxActive}"/>
        <property name="maxIdle" value="${jdbc.pool.maxIdle}"/>
        <property name="minIdle" value="0"/>
        <property name="maxWait" value="${jdbc.pool.maxWait}"/>
        <property name="defaultAutoCommit" value="true"/>

        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.pool.timeBetweenEvictionRunsMillis}"/>
        <property name="minEvictableIdleTimeMillis" value="${jdbc.pool.minEvictableIdleTimeMillis}"/>
        
        <property name="removeAbandoned" value="${jdbc.pool.removeAbandoned}"/>
        <property name="removeAbandonedTimeout" value="${jdbc.pool.removeAbandonedTimeout}"/>
        <property name="logAbandoned" value="${jdbc.pool.logAbandoned}"/>
        
        <property name="testWhileIdle" value="${jdbc.pool.testWhileIdle}"/>
        <property name="numTestsPerEvictionRun" value="${jdbc.pool.numTestsPerEvictionRun}"/>
         <property name="jdbcInterceptors"        value="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"/> 
    </bean>


1. maxActive="100"

表示并发情况下最大可从连接池中获取的连接数。

2、maxIdle="30"
如果在并发时达到了maxActive=100,那么连接池就必须从数据库中获取100个连接来供应用程序使用,当应用程序关闭连接后,由于maxIdle=30,因此并不是所有的连接都会归还给数据库,将会有30个连接保持在连接池种中,状态为空闲。

maxIdle对应的连接,实际上是连接池保持的长连接,这也是连接池发挥优势的部分,理论上讲保持较多的长连接,在应用请求时可以更快的响应,但是过多的连接保持,反而会消耗数据库大量的资源,因此maxIdle也并不是越大越好

3、minIdle=”2”
最小默认情况下并不生效,它的含义是当连接池中的连接少有minIdle,系统监控线程将启动补充功能,一般情况下我们并不启动补充线程。

4、removeAbandoned="true"
超过时间限制是否回收

5、removeAbandonedTimeout="60"
超时时间;单位为秒

6、logAbandoned="true"
关闭abanded连接时输出错误日志

有时粗心的程序编写者在从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到 maxActive直至连接池无法提供服务。现代连接池一般提供一种“智能”的检查,但设置了 removeAbandoned="true"时,当连接池连接数到达(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时便会启动连接回收,那种活动时间超过 removeAbandonedTimeout="60"的连接将会被回收,同时如果 logAbandoned="true"设置为true,程序在回收连接的同时会打印日志。 removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启,生产环境中连接的关闭应该靠程序自己保证。

一般会是几种情况出现需要removeAbandoned: 
1.代码未在finally释放connection , 不过我们都用sqlmapClientTemplate,底层都有链接释放的过程
2.遇到数据库死锁。以前遇到过后端存储过程做了锁表操作,导致前台集群中连接池全都被block住,后续的业务处理因为拿不到链接所有都处理失败了。

7.initialSize
连接池启动时创建的初始化连接数量(默认值为0)

8、maxWait
最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)

9、poolPreparedStatements
开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)

10、maxOpenPreparedStatements
开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)

11、minEvictableIdleTimeMillis
连接池中连接,在时间段内一直空闲,被逐出连接池的时间(默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)

12、minEvictableIdleTimeMillis
连接池中连接可空闲的时间,毫秒

13、timeBetweenEvictionRunsMillis

设置的Evict线程的时间,单位ms,大于0才会开启evict检查线程

timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用

每timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

14、testOnBorrow
顾明思义,就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验

15、testOnReturn
顾明思义,就是在进行returnObject对返回的connection进行validateObject校验,个人觉得对数据库连接池的管理意义不大

16、testWhileIdle
关注的重点,GenericObjectPool中针对pool管理,起了一个Evict的TimerTask定时线程进行控制(可通过设置参数timeBetweenEvictionRunsMillis>0),定时对线程池中的链接进行validateObject校验,对无效的链接进行关闭后,会调用ensureMinIdle,适当建立链接保证最小的minIdle连接数

17、validateQuery
代表检查的sql,用来检查连接是否有效的sql,要求是一个查询语句,如果validateQuery为null,则testOnBorrow、testOnReturn、testWhileIdle 都不会起作用

18、validateQueryTimeout
代表在执行检查时,通过statement设置,statement.setQueryTimeout(validationQueryTimeout)

19、numTestsPerEvictionRun
代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接.

1."testWhileIdle">true
2."testOnBorrow">false
3."testOnReturn">false
4."validationQuery">select sysdate from dual
5."validationQueryTimeout">1
6."timeBetweenEvictionRunsMillis">30000
7."numTestsPerEvictionRun">20


minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样
minEvictableIdleTimeMillis针对连接池中的连接对象
removeAbandonedTimeout针对未被close的活动连接.


20、JdbcInterceptors
设置 tomcat jdbc 连接池的拦截器
内置的拦截器:
org.apache.tomcat.jdbc.pool.interceptor.ConnectionState
追踪自动提交、只读状态、catalog和事务隔离等级等状态
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
追踪打开的statement,当连接被归还时关闭它们.

多个拦截器用;分割,例如:
javapoolProps.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");




如果使用该技术为全局技术,需要将配置信息写在 tomcat 的conf文件夹的context.xml文件中(参数参照上面的注释):
<resource
name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testwhileidle="true"
testonborrow="true"
testonreturn="false"
validationquery="SELECT 1"
validationinterval="30000"
timebetweenevictionrunsmillis="30000"
maxactive="100"
minidle="10"
maxwait="10000"
initialsize="10"
removeabandonedtimeout="60"
removeabandoned="true"
logabandoned="true"
minevictableidletimemillis="30000"
jmxenabled="true"
jdbcinterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" 
username="root"
password="password"
driverclassname="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mysql" />


注:异步获取连接
1.必须将fairQueue设置为true
2.必须将数据源转换为org.apache.tomcat.jdbc.pool.DataSource
//连接池的获取
Connection conn = null;
DataSource ds = null;
ResultSet rs  =null;
Statement stmt = null;
Context initCtx = new InitialContext();
ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/ens");





参考: http://blog.itpub.net/7971010/viewspace-1114524
      https://zhidao.baidu.com/question/153727978.html

参数说明: http://www.tuicool.com/articles/ZnEFZ33
          http://www.cnblogs.com/asoks/p/5321534.html

猜你喜欢

转载自rd-030.iteye.com/blog/2351590