阻止我有一個表articles
有50萬行。我只通過網絡應用程序使用select
查詢。我的所有頁面加載速度都很快(〜20ms),每個頁面都包含一個或兩個快速查詢(每個約10ms)。那些快速查詢可能會從articles
表中選擇一些內容,或者執行一些不相關的操作,如從另一個小表(5行)中選擇一行。慢讀查詢導致其他C3P0線程在acquireStatement
我有這個Web應用沒有問題每秒30次網頁瀏覽。
雖然某個特定頁面執行的選擇查詢非常慢(約30秒),因爲它幾乎對articles
表的500k行執行全表掃描,並且只返回3行。當發生這種情況時,其他快速頁面開始大幅減速,並在某些時候完全阻止。
注意,所有頁面使用事務,所有的疑問都select
太,他們不應該互相影響很大,性能明智的。
我還通過從控制檯手動執行該慢查詢(web應用程序的範圍之外),並從web應用快速頁面在所有不受影響驗證上述內容。所以我認爲應用程序層中會出現一些奇怪的現象。
任何想法爲什麼會發生這種情況?爲什麼所有線程都在com.mchange.v2.c3p0.stmt.GooGooStatementCache.acquireStatement
等待?
一些數據:
- MySQL的:32年5月5日
- 引擎:InnoDB的
- JDBC驅動程序:使用mysql-connector-java的5.1.26-bin.jar
- 池:c3p0- 0.9.1.2.jar
- ORM:冬眠3.6.8
- 池配置:http://pastebin.com/3zMARM1B
- 線程轉儲WH ILE卡:http://pastebin.com/YGisWCzY
- 的tomcat:Tomcat的6.0.32
- JDK:1.6.xx
您可以嘗試使用不同的引擎,如MyISAM。我不知道這是否會幫助或不... – Jason
難道仍在運行的準備語句是即將從聲明緩存驅逐? (這會導致其他線程等待可以完成)請參閱:https://forum.hibernate.org/viewtopic.php?p=2390809。嘗試增加語句緩存大小並查看是否有幫助 –
您提出了一個有效的@SamiKorhonen點。謝謝。將嘗試一下,讓你知道。 – cherouvim