【C3P0】默认配置并发情况遇到pool is already maxed out

        最近在正式环境中遇到acquire test -- pool is already maxed out. [managed: 15; max: 15]错误,导致之后整个程序无法访问,幸亏是在夜间早上,访问人数较少,不然后果不可估量。

       当时同时报的错误还有事务错误,一个接口里有3层事务,最里层的事务被catch了,以为这样会导致连接不会被释放,后来经过JMeter的并发测试才发现这个想法是不对的。

        下面说说我解决这个办法的过程吧:

1、使用JMeter设置2个线程并添加接口,设置完成后开启线程测试,并同时观察数据库连接进程显示多了两个,此时程序运行正常;

2、把线程调高到15个,然后开启测试,数据库连接进程多了15个,程序运行正常;

3、把线程调高到16个,然后开启测试,这时开始报pool is already maxed out,数据库连接依然为15个,并发量不是很多,接口还是可以正常返回【C3P0】默认配置并发情况遇到pool is already maxed out【C3P0】默认配置并发情况遇到pool is already maxed out【C3P0】默认配置并发情况遇到pool is already maxed out

最后发现了是配置的问题,原先的都是默认配置,通过学习C3P0的相关配置,于是把项目中的相关配置修改为最优配置,设置最大连接数为1000,如果当连接数超过1000还是会报pool is already maxed out的,这时候就要增加服务器做负载,同时还不能超过数据库的最大连接数。

        <!--初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3-->
		<property name="initialPoolSize" value="3"/>
		<!--最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0-->
		<property name="maxIdleTime" value="1800"/>
		<!--连接池中保留的最小连接数,默认为:3-->
		<property name="minPoolSize" value = "3" />
		<!--接池中保留的最大连接数。默认值: 15-->
		<property name="maxPoolSize" value="1000" />
		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3-->
		<property name="acquireIncrement" value="3" />
		<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false-->
		<property name="testConnectionOnCheckin" value="true" />
		<!--每隔多少秒检查所有连接池中的空闲连接。Default: 0-->
		<property name="idleConnectionTestPeriod" value="300" />

其中需要注意的是maxPoolSize不能超过数据库的最大连接数,否则会报too many connections错误。

【MYSQL】查询数据库最大连接数:show variables like '%max_connections%';

【MYSQL】修改数据库最大连接数:set GLOBAL max_connections = 200;(该设置只对当前有效,数据库重启后会恢复为默认配置,如果要永久生效则把配置写到配置文件里)