gpt4 book ai didi

java - c3p0 导致应用程序偶尔超时

转载 作者:行者123 更新时间:2023-11-30 09:30:34 25 4
gpt4 key购买 nike

我的应用程序每分钟都会被一个 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" />

最佳答案

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

maxIdleTime 是对您的问题的一种可能解释。您使用的配置不是很好。每分钟一个客户端连接对于 c3p0 来说是一个非常小的负载,但您的 minPoolSize 为 10 个连接。因此,c3p0 获取 10 个连接,将它们保留大约一分钟,然后过期并重新获取所有连接,这是大量的同时开销。您的 idleConnectionTestPeriod 为 80 秒是没有帮助的:永远不会测试空闲连接,因为它们将在空闲 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系列现在已经很稳定了,值得使用。

希望对您有所帮助!

关于java - c3p0 导致应用程序偶尔超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com