2012-03-29 11 views
5

Aby wykonać niektóre żądania od użytkownika, w mojej aplikacji wysyłam wiele zapytań DB z jednej metody, ale obecnie są one wykonywane sekwencyjnie &, więc aplikacja jest zablokowana do czasu otrzymania odpowiedzi/danych dla poprzedniego zapytania, a następnie przejścia do następnego zapytania. To nie jest coś, co bardzo lubię. Chciałbym wydawać równoległe zapytania.Równoległe zapytania do bazy danych dla pojedynczego żądania klienta

także po wydaniu zapytania Chciałbym zrobić jakąś inną pracę (zamiast być zablokowane do poprzedniej odpowiedzi zapytań) & na uzyskanie odpowiedzi dla każdego zapytania chciałbym wykonać blok kodu specyficzne dla danych Każde zapytanie jest. Jak to zrobić?

Edycja: Moje DB API zapewnia łączenie połączeń.


jestem tylko trochę zaznajomieni z wielowątkowości Java.

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

To jest wiele zawiłości tutaj. Zalecam rozpoczęcie od przeczytania o wątkach w Javie: http://docs.oracle.com/javase/tutorial/essential/concurenrency/ – Gray

Odpowiedz

-3

Oto bardzo trywialne/ograniczone podejście:

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 
} 

Jest to proste podejście, ale wiele innych możliwości (np grupowania wątek poprzez Java współbieżności wykonawców zadanie, wykonawcy zadania Wiosna, etc) są .

+1

Jest to w zasadzie jeden wątek, ponieważ masz tylko jeden obiekt połączenia , a wątek główny czeka (w niewłaściwy sposób - powinien używać join()) na wątku żądania – ControlAltDel

+0

@ user1291492: To rozwiązanie jest złe, czy mógłbyś dodać jakieś przykłady kodu/wskazówki, jak to zaimplementować w odpowiedzi? –

+0

Nie sądzę, że to w porządku, aby powiedzieć, że jest to pojedynczy wątek. Jego "inną pracę" można łatwo wykonać, gdy połączenie jest zajęte (zakładając, że go nie używa). Ostatecznie prawdopodobnie będzie potrzebował więcej niż jednego połączenia, aby poradzić sobie ze scenariuszem wielu wątków, ale był to podstawowy przykład, a nie pełne rozwiązanie. Zgadzam się z sugestią, aby użyć join zamiast pracowitego oczekiwania na końcu. – jsight

0

Należy zrozumieć, przed rozpoczęciem wykonywania tej

  1. Aby skorzystać z współbieżności, trzeba mieć wiele połączeń DB. Najlepszym sposobem rozwiązania tego problemu jest utworzenie puli db.

  2. Musisz utworzyć klasę runnable/wpłacone do wykonywania instrukcji dB. Musisz skonfigurować system komunikacyjny, aby powiadomić słuchaczy, kiedy zapytanie zakończyło się:

  3. Zrozum, że przy wysyłaniu wielu zgłoszeń w tym samym czasie, wszystkie zakłady są wyłączone, co zostanie zakończone jako pierwsze i że mogą być konflikty między oświadczeniami, które destabilizują twoją aplikację.

+0

Mój interfejs API dostępu DB zapewnia połączenie z połączeniem. Czy muszę się najpierw upewnić, co wśród wielu zapytań dotyczących danych zostanie ukończonych? Czy to jest tak, jakby to było pierwsze, co prowadzi do wykonania jego specyficznego bloku kodu? –

0

Mam podobne zadanie/problem. Aby uzyskać pełny wynik kompilacji, muszę wysłać kilka żądań dla kilku różnych usług (kilka na REST, kilka na Thrift), dla zmniejszenia opóźnienia muszę wysłać to równolegle. Moim pomysłem jest użycie java.util.concurrent.Future, utworzenie prostego menedżera agregacji, który tworzy wiele żądań razem i będzie czekać ostatnie pobrane odpowiedzi i zwróci wszystkie potrzebne dane. W bardziej zaawansowanym rozwiązaniu ten menedżer może tworzyć/łączyć wynik końcowy podczas innych zapytań, ale to rozwiązanie może nie być bezpieczne dla wątków.

Powiązane problemy