c3p0客户端在等待从com.mchange.v2.resourcepool.BasicResourcePool获取资源时超时

时间:2017-04-26 09:32:01

标签: mysql tomcat database-connection c3p0

我在tomcat版本7上部署了一个java应用程序。对于数据源,我使用连接到mysql数据库的c3p0。 它工作正常多年,最近我开始得到这个错误: "客户端在等待从com.mchange.v2.resourcepool.BasicResourcePool"获取资源时超时。

当我遇到此问题时,唯一的解决方案是重新启动应用程序。重启mysql没有帮助。

我还有使用保存数据库的php应用程序,它们不会受到影响,它们可以正常工作。

我的java应用程序仅由一个小团队使用,它是一个后端应用程序。

这是我的c3p0配置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="com.mysql.jdbc.Driver" />
  <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&amp;autoReconnect=true&amp;autoReconnectForPools=true" />
  <property name="user" value="viva4578" />
  <property name="password" value="amd139fbg" />
  <property name="initialPoolSize" value="5" />
  <property name="minPoolSize" value="5" />
  <property name="maxPoolSize" value="20" />
  <property name="maxConnectionAge" value="14400" />
  <property name="checkoutTimeout" value="30000" />
  <property name="acquireIncrement" value="1" />
  <property name="acquireRetryAttempts" value="30" />
  <property name="testConnectionOnCheckin" value="true" />
  <property name="testConnectionOnCheckout" value="true" />
  <property name="preferredTestQuery" value="SELECT 1" />
  <property name="idleConnectionTestPeriod" value="3600" />
  <property name="maxIdleTime" value="7200" />
  <property name="maxIdleTimeExcessConnections" value="1800" />
  <property name="unreturnedConnectionTimeout" value="3600" />
  <property name="debugUnreturnedConnectionStackTraces" value="true" />
</bean>

这是启动应用程序后c3p0的输出日志:

Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ 
  acquireIncrement -> 1,
  acquireRetryAttempts -> 30,
  acquireRetryDelay -> 1000,
  autoCommitOnClose -> false,
  userOverrides -> {},
  automaticTestTable -> null,
  breakAfterAcquireFailure -> false,
  checkoutTimeout -> 30000,
  connectionCustomizerClassName -> null,
  connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester,
  contextClassLoaderSource -> caller,
  dataSourceName -> z8kflt9n1b12nsh118544e|7bc1a68b,
  debugUnreturnedConnectionStackTraces -> true,
  description -> null,
  driverClass -> com.mysql.jdbc.Driver,
  extensions -> {},
  factoryClassLocation -> null,
  forceIgnoreUnresolvedTransactions -> false,
  forceUseNamedDriverClass -> false,
  identityToken -> z8kflt9n1b12nsh118544e|7bc1a68b,
  idleConnectionTestPeriod -> 3600,
  initialPoolSize -> 5,
  jdbcUrl -> jdbc:mysql://localhost:3306/db?relaxAutoCommit=true&autoReconnect=true&autoReconnectForPools=true,
  maxAdministrativeTaskTime -> 0,
  maxConnectionAge -> 14400,
  maxIdleTime -> 7200,
  maxIdleTimeExcessConnections -> 1800,
  maxPoolSize -> 20,
  maxStatements -> 0,
  maxStatementsPerConnection -> 0,
  minPoolSize -> 5,
  numHelperThreads -> 3,
  preferredTestQuery -> SELECT 1,
  privilegeSpawnedThreads -> false,
  properties -> {user=******, password=******},
  propertyCycle -> 0,
  statementCacheNumDeferredCloseThreads -> 0,
  testConnectionOnCheckin -> true,
  testConnectionOnCheckout -> true,
  unreturnedConnectionTimeout -> 3600,
  usesTraditionalReflectiveProxies -> false
]

我使用的是c3p0的0-0.9.5版本。

如果有人可以提供帮助

谢谢

3 个答案:

答案 0 :(得分:0)

下面

<property name="checkoutTimeout" value="30000" />

如果客户端无法在30秒内获得服务,则您已将c3p0配置为抛出此异常。那已经开始发生了。据推测,DataSource上的负荷增加了。考虑扩大规模。如果问题是异步任务中的积压,请使maxPoolSize更大,并增加numHelperThreads

(你也可以增加checkoutTimeout的值,或删除设置,以便客户端检查永远不会超时。这将消除此异常。但不是真正的问题.30秒是很长的等待时间对于一个连接。调整c3p0来提供连接的速度要快得多。)

答案 1 :(得分:0)

我最近在设置 maxPoolSize=0 时收到了相同的错误消息。任何遇到这个问题的人都可以考虑我的错误。

答案 2 :(得分:0)

就我而言,这是一个事务配置问题。我在一个服务中,有一个没有用 @Transaction 注释标记的方法