2012-04-22 69 views
0

您可以幫我解決兩個問題:使用java的應用程序的線程優先級

答:我們有一個表,其中讀取和寫入操作同時發生。寫入發生得非常嚴重,所以讀取速度非常慢 - 有時,由於此表上的繁重寫入操作,我的Web應用程序不能啓動。我怎麼能處理這種情況。通過不同的Java應用程序進行寫入,而通過我們的Web應用程序進行讀取,因此Web應用程序變得非常慢任何想法?

B.寫操作發生於該表通過發生200個線程,這些線程採取從連接池連接,並寫入表格和7本的應用程序運行24線程的優先級是有問題,並從Web應用程序停止讀操作。

下,我們可以有主 - 主複製該表only-這麼寫發生在一個表,寫操作發生在其他表和一個表每兩分數據遷移到另一個表?

請給我建議。

在此先感謝。

回答

0
  1. 檢查連接池的大小 - 也許是太小了,你的線程浪費時間等待來自池連接。
  2. 檢查您的數據庫設置,如果您只是使用開箱即用的參數運行它,那麼可能有一個很好的改進空間。
  3. 您可能需要某種事件驅動的系統 - 車輛發送數據時數據庫未更新,但消息被添加到某個隊列(例如JMS)。您的應用程序會在啓動時緩存數據,並在收到此消息時更新緩存和數據庫。關鍵是與數據庫交互的唯一組件是您的應用程序,並且僅當您收到事件時才更改數據 - 因此您不需要查詢數據庫來讀取數據,而且您可以只使用少量數據就可以在後臺執行更新線程等。有相當不錯的開源消息傳遞系統(例如Apache Active MQ)和緩存庫(例如EH Cache),因此您可以在不費力的情況下構建合理的性能和容錯系統。
  4. 我想引入消息傳遞將是一次嚴肅的重新設計,因此要解決您的即時問題,複製可能是最佳解決方案 - 每2分鐘將數據從可更新表合併到另一個表,並且跟蹤器將讀取另一個表;如果你只是讀取網絡應用程序中的數據,而不更新它們,那麼顯然工作得很好,否則你需要付出很大的努力來保持2個表的同步。其中的一個變化就是批量 - 來自車輛的數據被送入中間表,然後每隔2分鐘轉入主表,供讀者查詢;轉移後清洗中間表。
+0

我有兩個獨立的應用程序 - 一個應用程序在從HornetQ讀取數據包後將數據寫入數據庫,這是在不同的服務器上運行,但只寫入數據到也是獨立的DB服務器。我們有一個獨立的Web應用程序,可以從其他應用程序寫入的同一張表中讀取數據。所以我們有兩個應用程序向DB查詢同一個表,並且運行在不同服務器和數據庫上的應用程序也都在不同的服務器中。我已經使用HornetQ消息系統,但是這個JMS系統存儲來自設備的傳入數據包。建議我 – geekIndiana 2012-04-22 16:30:55

+0

嗯,那麼爲什麼2個應用呢?我將它們合併爲一個,並將數據存儲在Java緩存中,以便讀者不會進入數據庫。即使有2個應用 - 爲什麼200個作家?您可能受益於節流,使用更少的線程和更大的批次。角落案例是有一個線程運行循環,如:獲取所有消息,將它們寫入1個JDBC批處理,休眠一分鐘,永久重複; 1線程,每分鐘1次交易,有足夠的時間讓讀者運行他們的查詢。 – 2012-04-22 16:48:39

+0

我沒有得到這個邏輯,你能否完全解釋我。謝謝 – geekIndiana 2012-04-22 19:11:36

0

解決此問題的唯一方法是使用寫入事件隊列並定期停止寫入,以便讀者有機會。

  1. 創建傳入的寫入更新
  2. 隊列創建atomicXXX(見java.util.concurrency)作爲鎖
  3. 創建一個線程池從隊列中讀取並執行更新時使用的鎖定未設置
  4. 使用javax.swing.Timer定期設置鎖定並讀取表格數據。
+0

在我的情況下 - 我不能這樣做 - 因爲我需要向用戶展示他們的車輛的實時細節,我們已經在車輛上安裝了10,000個GPS設備,並且每個設備每2分鐘發送一次數據,希望通過網絡應用程序界面每兩分鐘跟蹤一次所有車輛。所以我們需要在同一時間進行讀寫操作。請建議。 – geekIndiana 2012-04-22 15:33:23

+0

如果你的計時器設置爲30或50毫秒,它將立即出現 – ControlAltDel 2012-04-22 15:51:22

+0

我沒有找到你 – geekIndiana 2012-04-22 16:05:26

0

之前嘗試任何太複雜試試這個也許是:

1)不要使用線程的優先級,他們很少你想要什麼。

2)設置您自己的優先級方案,或許只需對讀取和寫入進行優先級讀寫的寫入(優先級)隊列。即:將讀取和寫入請求添加到單個隊列,並將其阻塞或通知結果。

3)檢查數據庫功能,以優化寫入重表

+0

我們不能一起讀寫操作,我們有一個應用程序寫入數據庫和另一個應用程序讀取數據庫。兩者都是獨立的tomcat應用程序 - 所以我如何構建一個優先隊列來保持讀寫,需要建議 – geekIndiana 2012-04-22 16:04:49

+0

您可以讓應用程序通過另一個應用程序或引入第三個應用程序。 – 2012-04-22 16:26:04

+0

你檢查過你的數據庫表/行鎖定設置嗎?例如在MySql中,我認爲一些(大多數?)表默認爲表鎖定,如果您有很多寫操作,這是非常糟糕的。鎖定整個表...例如:http://dev.mysql.com/doc/refman/5.0/en/table-locking.html – 2012-04-22 16:27:41