Несколько запросов к базе данных параллельно, для одного запроса клиента - PullRequest
5 голосов
/ 30 марта 2012

Чтобы выполнить определенные запросы от пользователя, в моем приложении я отправляю несколько запросов к БД из одного метода, но в настоящее время они выполняются последовательно, и, таким образом, приложение блокируется до момента получения ответа / данных дляпредыдущий запрос, затем переход к следующему запросу.Это не то, что мне очень нравится.Я хотел бы выдавать параллельные запросы.

Также после выдачи запросов я хотел бы выполнить какую-то другую работу (вместо блокировки до ответа на предыдущие запросы) и получить ответ для каждого запроса, который я хотел бы выполнить.блок кода, специфичный для данных каждого запроса.Как это сделать?

Редактировать: Мой DB API обеспечивает пул соединений.


Я просто немного знаком с многопоточностью Java.

Using:-
------
Java 1.6
Cassandra 1.1 Database with Hector

Ответы [ 3 ]

0 голосов
/ 30 марта 2012

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

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

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

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

0 голосов
/ 24 апреля 2012

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

0 голосов
/ 30 марта 2012

Вот очень тривиальный / ограниченный подход:

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

...