大家好:
连接池参数我们一直未做优化,最近DBA反应在数据库端发现idle连接过多,影响正常连接。经过仔细研究、实践,我们得出一套较合理的连接池(DBCP)的配置参数,给大家分享一下。希望其它各PO按此参数调整线上TOMCAT的DBCP参数。
热数据源: maxActive="10" maxIdle="3" minIdle="2" maxWait="15000" timeBetweenEvictionRunsMillis="60000" minEvictableIdleTimeMillis="180000"
冷数据源:maxActive="5" maxIdle="2" minIdle="1" maxWait="15000" timeBetweenEvictionRunsMillis="60000" minEvictableIdleTimeMillis="180000"
冷热数据源可以这么分:前台访问均为热,后台管理端均为冷。当然,如果你某台机器Worker较多,数据库访问频繁,可以适当加大maxActive和maxIdle值,但是不建议加大minIdle值。还有个参数叫:initialSize。这个参数在server.xml中配置就要出错,但是在context.xml中配置就正常使用(tomcat 6)。如果你的连接池配置在context.xml中,建议把initialSize参数加上,配置成和minIdle一样。
这么配置后,还有个好处就是:有些防火墙会杀掉不动的连接,上面参数可以避免(MYSQL也会杀掉长期不活动的连接)。避免程序取出死连接,导致执行sql时出错。
也许上面的参数并不是最优的,但是在POP这边全面推广后,并没有发现什么大问题。以下是基本情况截图:
这个图表示目前只有一个在使用中,另外2个是空闲。一个空闲时间为956ms,另外一个空闲8160ms。
大部分的时候,Active为0,Idle为3。当然,我们刷新的时候,也许连接池中大部分连接已经被使用过并返还了。根据观察,在热数据源情况下,连接Idle时间基本上没有超过20S。
上图是冷数据源,连接总共才1个,实际上我们配置的maxIdle为2个。所以参数设置的还是挺合理的。这里还要注意一下。DBCP并不是tomcat一启动就立即初始化连接,他是在第一次使用的时候初始化。所以,你完全可以在tomcat中配置多个数据源,而不必担心没有使用到就会连接数据库而导致浪费。
贴一个系统生产环境配置.
type="javax.sql.DataSource"
initialSize="2" maxActive="10" maxIdle="3" minIdle="2" maxWait="15000"
testOnBorrow="true" testOnReturn="true" testWhileIdle="true"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
timeBetweenEvictionRunsMillis="60000" minEvictableIdleTimeMillis="180000"
validationQuery="SELECT 1"
name="mysqljdbc/XX"
url="jdbc:mysql://192.168.1.1:3306/XX?characterEncoding=utf-8"
password=""
username=" " />