Java 慢速读取查询导致其他c3p0线程在acquireStatement上阻塞

Java 慢速读取查询导致其他c3p0线程在acquireStatement上阻塞,java,mysql,performance,c3p0,Java,Mysql,Performance,C3p0,我有一个包含500k行的表articles。我只通过web应用程序使用select查询。我所有的页面加载速度都很快(~20ms),每个页面都包含一个或两个快速查询(~10ms)。这些快速查询可以从articles表中选择一些内容,也可以执行一些不相关的操作,例如从另一个小表(5行)中选择一行 我在这个webapp上每秒有30次页面浏览,没有问题 有时,尽管特定页面执行select查询非常慢(约30秒),因为它几乎对articles表的500k行进行了完整的表扫描,只返回3行。当这种情况发生时,其

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

我在这个webapp上每秒有30次页面浏览,没有问题

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

请注意,所有页面都使用事务,并且所有查询都是
select
s,因此它们在性能方面不会相互影响太多

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

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

一些数据:

  • MySQL:5.5.32
  • 引擎:InnoDB
  • jdbc驱动程序:mysql-connector-java-5.1.26-bin.jar
  • 池:c3p0-0.9.1.2.jar
  • orm:hibernate 3.6.8
  • 池配置:
  • 卡住时线程转储:
  • tomcat:tomcat-6.0.32
  • jdk:1.6.xx

运行缓慢的prepared语句可能即将从语句缓存中退出。这将导致其他线程等待语句关闭。增加语句缓存大小可以解决此问题。

您可以尝试使用其他引擎,例如MyIsam。我不知道这是否有帮助……是否仍在运行的准备好的语句即将从缓存的语句中逐出?(这会导致其他线程等待,直到可以完成为止)请参阅:。尝试增加语句缓存大小,看看它是否有助于您在@SamiKorhonen处提高一个有效点。谢谢我会尝试一下,让你知道。就是这样!!!我把它从
50
改为
5000
,问题就解决了!我将对我的应用程序进行基准测试,看看
0
(无语句缓存)是否足够好。
50
从2008年就出现了,因为我在2本hibernate书籍中看到过它,但从未真正研究过它到底有什么作用以及可能产生的副作用。请将其作为答案发布,以便我可以接受。