从数据库中并行获取每个主键的数据

时间:2011-07-21 03:45:23

标签: java database multithreading

我有主键列表ex:empids,我想从数据库中获取每个emplid的员工信息。或者更确切地说,我希望使用多个线程基于不同类型的empids从不同数据库获取数据。

目前我正在获取第一个员工信息并将其保存到Java bean中并获取第二个员工并将其保存到bean中。最后将所有这些bean添加到ArrayList,但现在我想从数据库中并行获取数据。我希望每次获得每位员工的员工信息并将其保存到bean中。

基本上我正在寻找并行处理而不是按顺序处理以提高性能。

2 个答案:

答案 0 :(得分:0)

在这种情况下,我不认为你正在寻找并行性。您真的在寻找一个单一的查询,它将返回ID在您拥有的ID集合中的所有员工。一个数据库连接,一个线程,一个查询和一个结果集。

如果您正在使用休眠,那么使用Hibernate Criteria非常容易,您可以在employeeId上使用Restrictions.IN并将其传递给ID。下面的查询类似于select a, b, c, ..., n from Employee where employee_id in (1,2,3,4...,m)

如果您使用的是直接JDBC,则可以在本机查询中实现相同的操作,您需要更改ResultSet解析,因为您现在可以期待回收。

答案 1 :(得分: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

在这种情况下,您仍然可以在不同的线程中进行数据库调用,但是您需要将每个线程写入共享的Employee集合。不要忘记同步对此集合的访问。

此外,您需要在所有已生成的线程上加入(),以便知道所有线程何时完成..