我有主鍵列表,例如:empids
,我想從數據庫中獲取每個emplid
的員工信息。或者說,我想從不同類型的數據庫中獲取數據empids
使用多線程。並行獲取每個主鍵的數據庫數據
當前我正在獲取第一個員工信息,並將其保存到Java bean中並獲取第二個員工並將其保存到bean中。最後將所有這些bean添加到ArrayList
,但現在我想從數據庫並行獲取數據。一次意味着我想獲得每個員工的員工信息並將其保存到bean中。
基本上我正在尋找並行處理而不是按順序來提高性能。
我有主鍵列表,例如:empids
,我想從數據庫中獲取每個emplid
的員工信息。或者說,我想從不同類型的數據庫中獲取數據empids
使用多線程。並行獲取每個主鍵的數據庫數據
當前我正在獲取第一個員工信息,並將其保存到Java bean中並獲取第二個員工並將其保存到bean中。最後將所有這些bean添加到ArrayList
,但現在我想從數據庫並行獲取數據。一次意味着我想獲得每個員工的員工信息並將其保存到bean中。
基本上我正在尋找並行處理而不是按順序來提高性能。
我不認爲你在這種情況下尋找並行性。你真的在尋找一個單一的查詢,它將返回所有員工的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解析,因爲您現在預計會收回一個集合。
@john這應該是你的問題的編輯(或最好作爲*原始*問題的一部分)。我已添加它,因此您可以刪除評論。 –
您可以創建一個可調用任務來獲取員工信息並從該可調用線程返回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;
}
編輯 - 針對Java 1.4
在這種情況下,你仍然可以在不同的線程調用數據庫,但是你需要讓每個線程寫入共享員工採集。不要忘記同步訪問這個集合。
你也需要加入()已對其產生了,讓你知道當所有線程都完成的所有線程..
但即時通訊使用jdk1.4和java.util.concurrent在jdk1.4中不可用 –
@john updated .. – Nrj
使用導致多個'employees'行的查詢(基於你的要求)。遍歷ResultSet',將行打包到bean/pojo/vo中,將它們添加到在循環外創建的'List'。出現循環時,返回列表。 – Nishant
你的問題是什麼? –