【问题标题】:slow read query causes other c3p0 threads to block on acquireStatement慢读查询导致其他c3p0线程阻塞acquireStatement
【发布时间】:2014-02-05 13:39:30
【问题描述】:

我有一个表 articles 有 500k 行。我只通过网络应用程序使用select 查询。我所有的页面加载速度都很快(~20ms),每个页面都包含一个或两个快速查询(每个~10ms)。这些快速查询可能会从articles 表中选择某些内容,也可能会执行一些不相关的操作,例如从另一个小表(5 行)中选择一行。

我在这个 web 应用上每秒有 30 次浏览量,没有问题。

有时,虽然特定页面执行一个非常慢(约 30 秒)的选择查询,因为它几乎对 articles 表的 500k 行进行全表扫描,只返回 3 行。当这种情况发生时,其他快速页面开始严重减速,并在某些时候完全阻塞。

请注意,所有页面都使用事务并且所有查询都是selects,因此它们之间不应有太大影响,从性能角度考虑。

我还通过从控制台手动执行这个慢速查询(在 webapp 范围之外)来验证上述内容,并且 webapp 中的快速页面根本不受影响。所以我认为应用层发生了一些奇怪的事情。

知道为什么会这样吗?为什么所有线程都在com.mchange.v2.c3p0.stmt.GooGooStatementCache.acquireStatement 等待?

一些数据:

【问题讨论】:

  • 您可以尝试使用不同的引擎,例如 MyIsam。我不知道这是否会有所帮助......
  • 会不会是仍在运行的准备好的语句即将从缓存的语句中被驱逐? (这会导致其他线程等待直到可以完成)参见:forum.hibernate.org/viewtopic.php?p=2390809。尝试增加语句缓存大小,看看是否有帮助
  • 你提出了一个有效的观点@SamiKorhonen。谢谢。会试一试,让你知道。
  • 就是这样!!!我将它从50 更改为5000,问题就消失了!我将对我的应用程序进行基准测试,看看0(无语句缓存)是否足够好。 50 自 2008 年以来就在那里,因为我在 2 部休眠书籍中看到过它,但从未真正研究过它到底做了什么以及它可能产生的副作用。请将其发布为答案,以便我接受。

标签: java mysql performance c3p0


【解决方案1】:

运行缓慢的准备好的语句很可能即将从语句缓存中被逐出。这将导致其他线程等待语句可以关闭。增加语句缓存大小应该可以解决问题。

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2013-07-11
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2014-04-03
    • 2023-03-03
    • 2012-11-08
    • 2017-02-28
    相关资源
    最近更新 更多