簡體   English   中英

使用Java的應用程序上的線程優先級

[英]Thread Priority on application using java

您能幫我解決兩個問題:

答:我們有一個表,在該表上同時進行讀寫操作。 寫的發生非常廣泛,因此讀的速度非常慢-有時由於此表上的大量寫操作,我的Web應用程序無法啟動。 我該如何處理這種情況。 寫入通過不同的Java應用程序進行,而讀取通過我們的Web應用程序進行,因此Web應用程序變得非常慢。 任何想法?

B.該表的寫操作發生在200個線程中,這些線程從連接池中獲取連接並寫入表中,此應用程序以7的速度運行24。是線程優先級出現問題並停止從Web應用程序進行讀取操作。

C.我們能否僅對該表進行master-master復制,以便在一個表中進行寫操作,而在另一表中進行寫操作,並且每兩分鍾將數據從一個表遷移到另一個表?

請給我建議。

提前致謝。

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

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

在嘗試任何過於復雜的方法之前,請嘗試以下操作:

1)不要使用線程優先級,它們很少是您想要的。

2)設置您自己的優先級方案,也許只是通過為優先級較高的讀取和寫入創建一個(優先級)隊列即可。 即:將讀取和寫入請求添加到單個隊列,並阻止或通知結果。

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

  1. 檢查連接池的大小-可能它太小,線程浪費時間等待來自池的連接。
  2. 檢查您的數據庫設置,如果僅使用開箱即用的參數運行數據庫,則可能有很大的改進空間。
  3. 您可能需要某種事件驅動的系統-當車輛發送數據時,DB不會更新,而是將消息添加到某個隊列(例如JMS)。 然后,您的應用程序會在啟動時緩存數據,並在收到此消息后同時更新緩存和數據庫。 關鍵是,與DB交互的唯一組件是您的應用程序,並且僅在收到事件時才更改數據-因此,您無需查詢DB即可讀取數據,此外,您僅需很少的操作即可在后台進行更新線程等。有相當不錯的開源消息傳遞系統(例如Apache Active MQ)和緩存庫(例如EH Cache),因此您可以花費很少的精力構建合理的性能和容錯系統。
  4. 我猜想引入消息傳遞將是一個認真的重新設計,因此要解決您的直接問題,復制可能是最好的解決方案-每隔2分鍾將數據從可更新表合並到另一個表中,跟蹤器將讀取另一個表。 如果僅讀取Web應用程序中的數據而不更新它們,顯然很有效,否則,您需要付出很多努力才能使2個表保持同步。 一種變化是批量處理-將車輛中的數據存儲到中間表中,然后每2分鍾將其傳輸到主表中,以供讀者查詢它們; 轉移后清潔中間表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM