2012-06-05 16 views
0

我有具有以下部件的Web應用程序:MySQL和Hibernate的同時讀寫

  1. 評論員通過一個基於瀏覽器的工具,不斷地做比賽的解說。使用hibernat將註釋插入到數據庫中。

  2. 很多用戶正在訪問URL來閱讀評論。 Hibernate正在讀取步驟#1中由評論員更新的表中的數據。

  3. 有一些存儲過程,以及設置爲每1小時運行一次。他們中很少有人訪問同一張表(用於步驟#1和#2),用於讀寫和更新目的。

現在我的問題是,無論何時該站點有100多個併發用戶在觀看特定的匹配評論,我的MySQL就會關閉。它顯示了大量的查詢卡在processlist中。他們中的很多人都在「複製到臨時表」狀態。這使得JBOSS頻繁重啓。

我正在使用hibernate中的事務處理讀寫操作。請幫忙,因爲我因爲這些崩潰而失去大賽。

回答

1

您有一個性能問題。很難提供始終有效的解決方案。你可以考慮做的是:

1)修改HQL(Hibernate)語句。爲了達到最佳效果,你需要在配置文件中寫入一個<property name="show_sql">true</property>的協議(如果你想查看實際參數,甚至可以使用log4jdbc這樣的工具)並分析輸出。在那裏你可以看到你最需要的SQL請求。在許多情況下,讀取和寫入db數據的更好策略可以顯着減少數據庫流量。並檢查你的桌子有很好的索引。

2)考慮使用二級緩存。 (通常hibernate只使用第一級緩存,在你的情況下它沒有用,因爲它綁定到一個會話。)然後,至少讀取實際註釋的請求可以由緩存服務,不需要去數據庫。 (注意:緩存可能會干擾存儲過程,看看你喜歡使用的緩存產品是否支持MySQL存儲過程,最壞的情況是你必須刪除關鍵表的存儲過程,並讓你的應用服務器所以它通過緩存。)

3)如果只有很少的表被大量使用,您可以考慮將它們緩存在您的應用程序中。這是更多的工作,但也許你可以根據應用程序的需求來做,所以你可能比使用一般的二級緩存更快。

4)如果沒有什麼幫助和流量真的太重,那麼也許你必須投資更多的硬件。

好運;-)

+0

有關網站400個併發用戶,在Linux系統工作正常,在1.x中的正常運行時間但是,每當某個預定的存儲過程運行時(針對同一個表),正常運行時間就會超過20,並導致mysql崩潰。很多時候我也遇到過mysql顯示processlist的進程太多,但都處於睡眠模式!!! –

+0

存儲過程可以鎖定可能會干擾Web應用程序的資源(此處爲表格列)即其服務。你可以發佈一個讓數據庫崩潰的存儲過程嗎?順便說一下,你使用哪個引擎作爲表格? – Johanna

+0

我正在使用innodb。存儲過程只是從表中的行中讀取具有列dirty_bit = 1的行,然後在其他表中進行一些插入並設置dirty_bit = 0.它每分鐘運行一次,大部分時間dirty_bit爲0,因此不執行任何插入/更新。 –