【发布时间】: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 等待?
一些数据:
- MySQL:5.5.32
- 引擎:InnoDB
- jdbc驱动:mysql-connector-java-5.1.26-bin.jar
- 池:c3p0-0.9.1.2.jar
- orm: 休眠 3.6.8
- 池配置:http://pastebin.com/3zMARM1B
- 卡住时的线程转储:http://pastebin.com/YGisWCzY
- tomcat:tomcat-6.0.32
- jdk:1.6.xx
【问题讨论】:
-
您可以尝试使用不同的引擎,例如 MyIsam。我不知道这是否会有所帮助......
-
会不会是仍在运行的准备好的语句即将从缓存的语句中被驱逐? (这会导致其他线程等待直到可以完成)参见:forum.hibernate.org/viewtopic.php?p=2390809。尝试增加语句缓存大小,看看是否有帮助
-
你提出了一个有效的观点@SamiKorhonen。谢谢。会试一试,让你知道。
-
就是这样!!!我将它从
50更改为5000,问题就消失了!我将对我的应用程序进行基准测试,看看0(无语句缓存)是否足够好。50自 2008 年以来就在那里,因为我在 2 部休眠书籍中看到过它,但从未真正研究过它到底做了什么以及它可能产生的副作用。请将其发布为答案,以便我接受。
标签: java mysql performance c3p0