2012-03-29 62 views
5

爲了完成來自用戶的某些請求,在我的應用程序中,我從單個方法發出多個DB查詢,但它們當前正在按順序執行&因此應用程序被阻止直到它收到前一個查詢的響應/數據爲止,然後繼續進行下一個查詢。這不是我喜歡的東西。我想發出並行查詢。針對單個客戶端請求並行執行多個數據庫查詢

也發出查詢後,我想做一些其他的工作,而不是被阻止,直到以前的查詢響應&獲取每個查詢的響應我想執行特定於每個查詢的數據的代碼塊。有什麼辦法做到這一點?

編輯:我的數據庫API確實提供連接池。


只是一點點熟悉Java多線程。

Using:- 
------ 
Java 1.6 
Cassandra 1.1 Database with Hector 
+1

這裏有很多錯綜複雜的東西。我建議先閱讀關於Java線程的一些知識:http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Gray 2012-03-29 20:06:23

回答

-3

這裏是一個非常瑣碎/有限的方法:

final Connection conn = ...; 
final Object[] result = new Object[1]; 
Thread t1 = new Thread(new Runnable() { 
    public void run() { 
     Object results = conn.executeQuery(); 
     result[0] = results; 
    } 
}); 
t1.setName("DBQueryWorker"); 
t1.start(); 
// do other work 
while (t1.isAlive()) { 
    // wait on thread one 
} 

這是一個簡單的方法,但許多人是可能的(例如,通過Java併發任務執行線程池,春季任務執行等) 。

+1

這基本上是單線程的,因爲你只有1個Connection對象,並且主線程等待(以錯誤的方式 - 在請求線程上使用join()) – ControlAltDel 2012-03-29 20:19:00

+0

@ user1291492:因爲這種解決方案是錯誤的,您可以在答案中添加一些關於如何實現這個的代碼示例/提示嗎? – 2012-03-30 05:16:20

+0

我認爲這是單線程的並不公平。他的「其他工作」很容易在連接忙碌時完成(假設它不使用它)。最終,他可能需要多個連接來處理他的多線程場景,但這只是一個基本的例子,而不是一個完整的解決方案。 雖然我同意在最後使用連接而不是忙碌等待的建議。 – jsight 2012-03-30 15:23:07

0

你開始做這個

  1. 之前從併發受益你應該明白,你需要有多個數據庫的連接。解決這個問題的最好方法是創建一個數據庫池。

  2. 您需要爲執行db語句創建一個runnable/callable類。您需要將一些消息系統放在一起,以便在查詢完成時提醒聽衆

  3. 瞭解當您在同一時間發送多個請求時,所有投注都關閉,哪些將首先完成,可能會導致您的應用程序不穩定的語句之間發生衝突。

+0

我的數據庫訪問API提供連接池。我是否需要確定多個數據查詢中的哪些將首先完成?不管它是什麼完成,它會導致執行其特定的代碼塊? – 2012-03-30 05:21:44

0

我有類似的任務/問題。爲了獲得完整的構建結果,我需要針對幾種不同的服務發送少量請求(REST上很少,Thrift上很少),以減少需要並行發送的延遲。我的想法是使用java.util.concurrent.Future,創建簡單的聚合管理器,它將一起創建許多請求,並將等待上次檢索到的響應並返回所有需要的數據。在更高級的解決方案中,該經理可以在其他查​​詢期間製作/合併最終結果,但此解決方案可能不是線程安全的。

相關問題