Получите данные из баз данных для каждого primaryKey параллельно - PullRequest
0 голосов
/ 21 июля 2011

У меня есть список первичных ключей, например: empids, я хочу получить информацию о сотруднике для каждого emplid из базы данных. Или, скорее, Я хочу получить данные из разных баз данных на основе различных типов empids, используя несколько потоков .

В настоящее время я извлекаю информацию о первом сотруднике и сохраняю ее в Java-компонент, извлекаю второго сотрудника и так далее сохраняю в компоненте. Наконец, добавив все эти бины в ArrayList, теперь я хочу получать данные из баз данных параллельно. Означает, что за один раз я хочу получить информацию о сотруднике для каждого сотрудника и сохранить ее в бобе.

По сути, я ищу параллельную обработку, а не последовательную, чтобы повысить производительность.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Вы можете создать вызываемую задачу для извлечения информации о сотруднике и возврата 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

В этом случае вы все еще можете выполнять вызовы из базы данных в разных потоках, но вам нужно будет заставить каждый поток записывать в общую коллекцию Employee. Не забудьте синхронизировать доступ к этой коллекции.

Также вам нужно будет присоединиться () ко всем потокам, которые вы создали, чтобы вы знали, когда все потоки завершены ..

0 голосов
/ 21 июля 2011

Я не думаю, что вы ищете параллелизм в этом случае.Вы действительно ищете один запрос, который вернет всех сотрудников, чей идентификатор находится в вашей коллекции идентификаторов.Одно соединение с базой данных, один поток, один запрос и набор результатов.

Если вы используете hibernate, это очень просто с Hibernate Criteria, где вы можете использовать Restrictions.IN для employeeId и передать ему коллекциюиз идентификаторовЗапрос под ним будет выглядеть примерно так: select a, b, c, ..., n from Employee where employee_id in (1,2,3,4...,m)

Если вы используете прямой JDBC, вы можете добиться того же в своем собственном запросе, вам нужно будет изменить синтаксический анализ ResultSet, потому что теперь вы будете ожидать возврата коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...