我使用Spring MVC + MySQL开发Web应用程序。为了管理JDBC连接,我使用c3p0进行连接池。
如果我正在使用c3p0,我想如果,5个连接在池中打开,并且所有5个连接都处于睡眠模式,如果我从java请求getConnection()
,那么其中一个应该返回为{{1 }}。我是对的吗?
如果是,那么请考虑以下负载测试场景,我将获得异常Connection
。使用Connections could not be acquired from the underlying database!
我在15秒内开始为250个用户加载测试。我使用Jmeter
持续观察数据库连接,前几分钟一切都进展顺利,但因为投入到Web服务器连接数的所有250个用户计数达到500,这是我们的SHOE FULL PROCESSLIST
。所以在此之后我们得到maxPoolSize
。
此时如果我执行Connections could not be acquired from the underlying database!
,那么我可以看到所有500个连接都处于睡眠模式。如果我在上面的语句中是正确的,那么处于睡眠模式的任何打开连接都将由c3p0返回。 那我为什么会得到这个例外。?
这是我的c3p0属性
SHOE FULL PROCESSLIST
更新
我在MINPOOLSIZE=10
ACQUIREINCREMENT=1
MAXPOOLSIZE=500
INITIALPOOLSIZE=10
NUMBERHELPERTHREAD=100
MAXIDLETIME=10
MAXSTATEMENT=20
MAXSTATEMENTPERCONNECTION=5
IDLECONNECTIONTESTPERIOD=120
ACQUIRERETRYATTEMPT=10
ACQUIRERETRYDELAY=100
AUTOCOMMITONCLOSE=false
BREAKAFTERACQUIREFAILURE=false
TESTCONNECTIONONCHECKOUT=true
TESTCONNECTIONONCHECKIN=true
例外
Connections could not be acquired from the underlying database!