C3P0 maxPoolSize用尽了

时间:2013-07-16 06:04:13

标签: jdbc database-connection connection-pooling c3p0

我有一个使用C3P0进行连接池的应用程序。它已经工作了很长时间,但最近我在尝试访问数据库时遇到以下异常。

com.amazon.carbonado.FetchException: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@1bdc777 -- timeout at awaitAvailable()

通过Google搜索我发现这是由于maxPoolSize已耗尽。我将池大小从25增加到100,以检查是否是原因。它是暂时修复的,但是一段时间后我在尝试数据库连接时再次看到错误(当时没有任何其他数据库连接请求)。当我检查DB的活动/非活动连接时,在v $ session中只有一个来自机器的条目。但我收到了这个错误。我不明白连接的使用位置?

有人可以告诉我为什么会发生这种情况。另外,C3P0中的maxPoolSize代表什么?是否可以检出数据库连接?

poolSize还代表实际的dbConnections吗?

1 个答案:

答案 0 :(得分:4)

一些事情。 com.mchange.v2.resourcepool.TimeoutException表示您已设置checkoutTimeout且已超出此范围。这通常是因为您点击maxPoolSize并且Connections没有快速返回,但不一定。如果该值非常小,则在非最大化池上的Connection获取可能会引发此问题。

它说,这听起来非常像你的Connection泄漏导致一个疲惫的池。 (验证,取消设置checkoutTimeout,看看你的应用程序是否最终无限期挂起,而不是抛出异常。)如果你泄漏了Connections,你想要

  1. 请务必使用可靠的资源清理习惯来管理Connections - here,点击“show rest of quote”。

  2. 使用unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces来追踪并修复连接泄漏。另见this discussion

  3. 祝你好运!