2014-01-16 22 views
2

阻止我有一個表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
+0

您可以嘗試使用不同的引擎,如MyISAM。我不知道這是否會幫助或不... – Jason

+2

難道仍在運行的準備語句是即將從聲明緩存驅逐? (這會導致其他線程等待可以完成)請參閱:https://forum.hibernate.org/viewtopic.php?p=2390809。嘗試增加語句緩存大小並查看是否有幫助 –

+0

您提出了一個有效的@SamiKorhonen點。謝謝。將嘗試一下,讓你知道。 – cherouvim

回答

3

很可能是緩慢的運行準備的語句是即將從語句緩存驅逐。這會導致其他線程等待,直到語句可以關閉。增加語句緩存大小可以解決問題。