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

时间:2014-01-16 15:02:25

标签: java mysql performance c3p0

我有一个500k行的表articles。我只通过网络应用程序对其进行select次查询。我的所有页面都加载速度很快(约20毫秒),每个页面都包含一个或两个快速查询(每个约10毫秒)。那些快速查询可以从articles表中选择一些东西,或者做一些不相关的事情,比如从另一个小表(5行)中选择一行。

我在这个网络应用上每秒有30次综合浏览量没有问题。

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

请注意,所有网页都使用了交易,而且所有查询都是select,所以它们不应该相互影响,性能明显。

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

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

一些数据:

1 个答案:

答案 0 :(得分:3)

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