c3p0连接池超出maxPoolSize
c3p0连接池超出maxPoolSize回报以下错误:
Caud by: org.ptions.PersistenceException:
### Error querying databa. Cau: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
### The error may exist in INF/class/config/l]
### The error may involve com.tuniu.finance.xff.auth.dao.AuthPhoneMapper.lectByMemberId
### The error occurred while executing a query
### Cau: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at org.ptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.3.1.jar:3.3.1]
at org.apache.ibatis.ssion.defaults.DefaultSqlSession.lectList(DefaultSqlSession.java:122) ~[mybatis-3.3.1.jar:3.3.1]
flect.GeneratedMethodAccessor128.invoke(Unknown Source) ~[na:na]
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at flect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
batis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358) ~[mybatis-spring-
1.2.1.jar:1.2.1]
... 66 common frames omitted
Caud by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at org.springframework.jdbc.Connection(DataSourceUtils.java:80) ~[spring-jdbc-
4.3.8.RELEASE.jar:4.3.8.RELEASE]
ansaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:83) ~[mybatis-spring-1.2.1.jar:1.2.1]
Connection(SpringManagedTransaction.java:69) ~[mybatis-spring-1.2.1.jar:1.2.1]
at org.Connection(BaExecutor.java:315) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.SimpleExecutor.prepareStatement(SimpleExecutor.java:75) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.SimpleExecutor.doQuery(SimpleExecutor.java:61) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.BaExecutor.queryFromDataba(BaExecutor.java:303) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.BaExecutor.query(BaExecutor.java:154) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.CachingExecutor.query(CachingExecutor.java:102) ~[mybatis-3.3.1.jar:3.3.1]
at org.utor.CachingExecutor.query(CachingExecutor.java:82) ~[mybatis-3.3.1.jar:3.3.1]
flect.GeneratedMethodAccessor93.invoke(Unknown Source) ~[na:na]
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at flect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.3.1.jar:3.3.1]
at com.tuniu.finance.xff.auth.curity.SecurityPlugin.interceptQuery(SecurityPlugin.java:53) ~[auth-intf-2.0.0.jar:na]
at com.tuniu.finance.xff.auth.curity.SecurityPlugin.intercept(SecurityPlugin.java:76) ~[auth-intf-2.0.0.jar:na]
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.3.1.jar:3.3.1]
at com.sun.proxy.$Proxy103.query(Unknown Source) ~[na:na]
at org.apache.ibatis.ssion.defaults.DefaultSqlSession.lectList(DefaultSqlSession.java:120) ~[mybatis-3.3.1.jar:3.3.1]
... 70 common frames omitted
Caud by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
hange.v2.SQLException(SqlUtils.java:118) ~[mchange-commons-java-0.2.11.jar:0.2.11]
hange.v2.SQLException(SqlUtils.java:77) ~[mchange-commons-java-0.2.11.jar:0.2.11]
hange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690) ~ [c3p0-0.9.5.2.jar:0.9.5.2]
hange.v2.c3p0.Connection(AbstractPoolBackedDataSource.java:140) ~[c3p0-0.9.5.2.jar:0.9.5.2]
flect.GeneratedMethodAccessor92.invoke(Unknown Source) ~[na:na]
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_91]
at flect.Method.invoke(Method.java:498) ~[na:1.8.0_91]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) ~[spring-aop-
4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-
4.3.8.RELEASE.jar:4.3.8.RELEASE]
at com.sun.proxy.$Connection(Unknown Source) ~[na:na]
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) ~[spring-jdbc-
4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.jdbc.Connection(DataSourceUtils.java:77) ~[spring-jdbc-
4.3.8.RELEASE.jar:4.3.8.RELEASE]
... 88 common frames omitted
Caud by: sourcepool.TimeoutException: A client timed out while waiting to acquire a resource from
sourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1467) ~[c3p0-0.9.5.2.jar:0.9.5.2]
sourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644) ~[c3p0-
0.9.5.2.jar:0.9.5.2]
sourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554) ~[c3p0-0.9.5.2.jar:0.9.5.2]
at
hange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685) ~ [c3p0-0.9.5.2.jar:0.9.5.2]
... 97 common frames omitted
报错处的c3p0源码
/*
* by the mantics of wait(), a timeout of zero means forever.
*/
private void awaitAvailable(long timeout) throws InterruptedException, TimeoutException, ResourcePoolException
{
asrt Thread.holdsLock( this );
if (force_kill_acquires)
throw new ResourcePoolException("A ResourcePool cannot acquire a new resource -- the factory or source appears to be down.");
Thread t = Thread.currentThread();
try
{
acquireWaiters.add( t );
int avail;
long start = ( timeout > 0 ? System.currentTimeMillis() : -1);
if (Debug.DEBUG && Debug.TRACE == Debug.TRACE_MAX)
{
if ( logger.isLoggable( MLevel.FINE ) )
logger.fine("awaitAvailable(): " +
(exampleResource != null ?
exampleResource :
"[unknown]") );
trace();
}
while ((avail = unud.size()) == 0)
{
// the if ca below can only occur when 1) a ur attempts a
/
/ checkout which would provoke an acquire; 2) this
// increments the pending acquires, so we go to the
// wait below without provoking postAcquireMore(); 3)
// the resources are acquired; 4) external management
// of the pool (via for instance unpoolResource()
// depletes the newly acquired resources before we
// regain this' monitor; 5) we fall into wait() with
// no acquires being scheduled, and perhaps a managed.size()
// of zero, leading to deadlock. This could only occur in
// fairly pathological situations where the pool is being
// externally forced to a very low (even zero) size, but
/
/ since I've en it, I've fixed it.
if (pending_acquires == 0 && managed.size() < max)
_recheckResizePool();
this.wait(timeout);
if (timeout > 0 && System.currentTimeMillis() - start > timeout)
throw new TimeoutException("A client timed out while waiting to acquire a resource from " + this + " -- timeout at awaitAvailable()");
if (force_kill_acquires)
throw new CannotAcquireResourceException("A ResourcePool could not acquire a resource from its primary factory or source.");
ensureNotBroken();
}
}
finally
{
}
}
解决⽅案:
1.增加maxPoolSize⼤⼩
2.排查系统,减少db使⽤次数,优化代码c3p0连接池使⽤情况查看
要开启jmx