2012-03-29 2 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

ответ

-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 параллелизма Spring задачи исполнителей и т.д.) ,

+1

Это по существу однопоточное, поскольку у вас есть только 1 объект Connection , и главный поток ждет (неправильным образом - следует использовать join()) в потоке запроса – ControlAltDel

+0

@ user1291492: Если это решение неверно, можете ли вы добавить примеры кода/подсказки о том, как реализовать это, в вашем ответе? –

+0

Я не думаю, что это справедливо, чтобы сказать, что это однопоточное. Его «другая работа» может быть легко выполнена, когда соединение занято (при условии, что оно не использует его). В конечном счете, ему, вероятно, понадобится более одного соединения для решения его сценария с несколькими потоками, но это был базовый пример, а не полное решение. Я согласен с предложением использовать соединение вместо оживленного ожидания в конце. – jsight

0

Вы должны понимать, прежде чем вы начнете делать это

  1. Чтобы получить пользу от параллельности, вам необходимо иметь несколько подключения к БД. Лучший способ решить это - создать пул db.

  2. Вам необходимо создать исполняемый/вызываемый класс для выполнения инструкции db. Вам нужно будет собрать некоторую систему обмена сообщениями, чтобы предупредить слушателей, когда ваш запрос завершен.

  3. Поймите, что, когда вы отправляете несколько запросов одновременно, все ставки отключены по мере того, как это будет выполнено в первую очередь, и что там могут быть конфликты между заявлениями, которые дестабилизируют ваше приложение.

+0

Мой API доступа к базе данных обеспечивает объединение пулов. Должен ли я быть уверенным в том, что из нескольких запросов данных будет завершено первым? Не может быть, что бы это ни было, прежде всего, это приведет к выполнению его конкретного кода? –

0

У меня есть аналогичная задача/вопрос. Для полного результата сборки мне нужно отправить несколько запросов на несколько разных сервисов (немногие из REST, некоторые из Thrift), для уменьшения латентности мне нужно отправить его параллельно. Моя идея заключается в использовании java.util.concurrent.Future, создайте простой менеджер агрегации, который создает много запросов вместе и будет ждать последнего полученного ответа и вернуть все необходимые данные. В более продвинутом решении этот менеджер может создавать/комбинировать конечный результат во время других запросов, но это решение может быть небезопасным.