2

我的应用程序每分钟都会被一个 http 请求查询。当 c3p0 运行 CullExpired 和其他后台线程时,应用程序会暂时超时并无响应。此问题随机发生且不经常发生。应用程序超时时的所有实例,我看到 c3p0 后台线程正在运行,试图进行清理或驱逐空闲连接。这非常随机发生,日志中没有其他异常。一段时间后,应用程序会自动恢复并继续处理。有没有人遇到过这样的问题。

   c3p0 version is <version>0.9.1.2</version>
    hibernate version is <version>3.3.2.GA</version>

我的 c3p0 配置是:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close" 
        p:driverClass="#{['app.jdbc.driverClassName']}"
        p:jdbcUrl="#{['app.jdbc.url']}" 
        p:user="#{['app.jdbc.username']}" 
        p:password="#{['app.jdbc.password']}"
        p:acquireIncrement="5" 
        p:idleConnectionTestPeriod="80"
        p:maxAdministrativeTaskTime="600" 
        p:numHelperThreads="10"
        p:maxIdleTime="60" 
        p:maxPoolSize="20" 
        p:maxStatements="30"
        p:minPoolSize="10" />
4

1 回答 1

2

c3p0 的后台线程始终存在;它们在线程池中运行。您已将该池的大小设置为 10 个线程 (c3p0.numHelperThreads)。如果您检查堆栈转储,在您的配置下,您会看到像 CullExpired 这样的 c3p0 任务非常频繁地运行。这些频率与使资源过期的配置设置处于同一数量级。在您的情况下, maxIdleTime 是 60 秒,因此剔除任务可能每 20 秒左右运行一次。c3p0 的管理任务经过精心设计,不会在 IO 期间持有锁,并且通常是轻量级的,并且尽可能不与其他工作抗衡。因此,如果是这些管理任务导致您挂起,那么奇怪的事情正在发生。但是这里很难区分原因和巧合:c3p0'

maxIdleTime 是您的问题的一种可能解释。您使用的配置不是很好。每分钟一个客户端连接对于 c3p0 来说是一个非常小的负载,但您的 minPoolSize 为 10 个连接。因此,c3p0 抓取 10 个连接,将它们保留大约一分钟,然后过期并重新获取它们,这是一个很大的同时开销。80 秒的 id​​leConnectionTestPeriod 没有帮助:永远不会测试空闲连接,因为它们将在空闲 60 秒后过期,在测试期过去之前。我也会将 acquireIncrement 降回默认值 3。

我会尝试更好的配置,看看是否能解决问题。鉴于您描述的负载,我将 minPoolSize 保留为默认值 3,并将 numHelperThreads 设置为 3。作为第一遍,我将 maxIdleTime 设置为其默认值零,但将 testConnectionOnCheckout 设置为 true。这是连接测试的最简单和最可靠的形式,但它要求客户端可见的性能成本。为了最大限度地降低成本,您应该设置一个 preferredTestQuery 而不是依赖于慢速默认连接测试。通常“SELECT 1”有效,但它可能取决于您的数据库/JDBC 驱动程序。如果事情看起来不错,您可能会更大胆,尝试性能稍高、健壮性稍差的连接测试策略:将 idleConnectionTestPeriod 设置为相对较小的值(例如 30),并将 testConnectionOnCheckin 设置为 true(并将 testConnectionOnCheckout 设置为默认值 false)。看 [http://www.mchange.com/projects/c3p0/#configuring_connection_testing ]

此外,我现在会关闭语句缓存(将 maxStatements 设置为 0),稍后在事情稳定时将其重新打开,以测试它是否可以提高应用程序的性能。[ 那是一个如果 - 请参阅http://www.mchange.com/projects/c3p0/#known_shortcomings ]

我还建议更新到最新版本的 c3p0 [c3p0-0.9.2-pre5]。连接获取在 0.9.2 中更轻量级,部分问题可能与每 1 分钟刷新和重新获取周期有关。总的来说,我认为 0.9.2-pre 系列现在相当稳定,值得使用。

我希望这有帮助!

于 2012-11-04T16:50:22.190 回答