我有一个使用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吗?
答案 0 :(得分:4)
com.mchange.v2.resourcepool.TimeoutException
表示您已设置checkoutTimeout
且已超出此范围。这通常是因为您点击maxPoolSize
并且Connections
没有快速返回,但不一定。如果该值非常小,则在非最大化池上的Connection
获取可能会引发此问题。
它说,这听起来非常像你的Connection
泄漏导致一个疲惫的池。 (验证,取消设置checkoutTimeout
,看看你的应用程序是否最终无限期挂起,而不是抛出异常。)如果你泄漏了Connections,你想要
请务必使用可靠的资源清理习惯来管理Connections - here,点击“show rest of quote”。
使用unreturnedConnectionTimeout和debugUnreturnedConnectionStackTraces来追踪并修复连接泄漏。另见this discussion。