2

我有一个使用 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()

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

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

poolSize 是否也代表实际的 dbConnections ?

4

1 回答 1

4

一些东西。com.mchange.v2.resourcepool.TimeoutException表示你已经设置了 acheckoutTimeout并且已经超过了。这通常是因为您已经击中maxPoolSize并且Connections没有迅速返回,但不一定。如果该值非常小,则Connection在未达到上限的池中获取可能会引发此问题。

也就是说,听起来很像您所拥有的是Connection导致池耗尽的泄漏。(验证、取消设置checkoutTimeout并查看您的应用程序是否最终无限期挂起,而不是抛出异常。)如果您正在泄漏连接,您想要

  1. 确保在管理连接时使用可靠的资源清理习语——在这里,单击“显示其余报价”。

  2. 使用unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTraces来追踪和修复连接泄漏。另请参阅此讨论

祝你好运!

于 2013-07-16T07:57:41.527 回答