2011-07-21 69 views
0

我有主鍵列表,例如:empids,我想從數據庫中獲取每個emplid的員工信息。或者說,我想從不同類型的數據庫中獲取數據empids使用多線程並行獲取每個主鍵的數據庫數據

當前我正在獲取第一個員工信息,並將其保存到Java bean中並獲取第二個員工並將其保存到bean中。最後將所有這些bean添加到ArrayList,但現在我想從數據庫並行獲取數據。一次意味着我想獲得每個員工的員工信息並將其保存到bean中。

基本上我正在尋找並行處理而不是按順序來提高性能。

+0

使用導致多個'employees'行的查詢(基於你的要求)。遍歷ResultSet',將行打包到bean/pojo/vo中,將它們添加到在循環外創建的'List'。出現循環時,返回列表。 – Nishant

+0

你的問題是什麼? –

回答

0

我不認爲你在這種情況下尋找並行性。你真的在尋找一個單一的查詢,它將返回所有員工的ID在您擁有的ID集合中。一個數據庫連接,一個線程,一個查詢和一個結果集。

如果您使用的是hibernate,那麼您可以使用Hibernate Criteria超級簡單,您可以在employeeId上使用Restrictions.IN並將它傳遞給id的集合。下面的查詢將是類似於select a, b, c, ..., n from Employee where employee_id in (1,2,3,4...,m)

如果您使用的是直接JDBC,則可以在您的本機查詢中實現相同的操作,但您需要更改ResultSet解析,因爲您現在預計會收回一個集合。

+0

@john這應該是你的問題的編輯(或最好作爲*原始*問題的一部分)。我已添加它,因此您可以刪除評論。 –

0

您可以創建一個可調用任務來獲取員工信息並從該可調用線程返回ArrayList

然後,您可以使用Executor提交任務,並獲取期貨的句柄以循環返回結果。

//sudo code for 
Future<Arraylist<Employee>> fut = executor.submit(new EmployeeInfoTask(empIds)); 
//EmployeeInfoTask is a callable 

for(Arraylist<Employee> result : fut){ 
    //print result; 
} 

ExecutorCallable

編輯 - 針對Java 1.4

在這種情況下,你仍然可以在不同的線程調用數據庫,但是你需要讓每個線程寫入共享員工採集。不要忘記同步訪問這個集合。

你也需要加入()已對其產生了,讓你知道當所有線程都完成的所有線程..

+0

但即時通訊使用jdk1.4和java.util.concurrent在jdk1.4中不可用 –

+0

@john updated .. – Nrj