Tomcat-Jdbc-Pool配置及性能调优

来源:互联网 发布:云计算三年行动计划 编辑:程序博客网 时间:2024/06/04 17:42
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一样大,这样每次可以有效检查所有的链接. 

Java代码  收藏代码
  1. 1."testWhileIdle">true  
  2. 2."testOnBorrow">false  
  3. 3."testOnReturn">false  
  4. 4."validationQuery">select sysdate from dual  
  5. 5."validationQueryTimeout">1  
  6. 6."timeBetweenEvictionRunsMillis">30000  
  7. 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");


0 0