2012-03-29 20 views
5

Um bestimmte Anforderungen des Benutzers zu erfüllen, erstelle ich in meiner Anwendung mehrere DB-Abfragen von einer einzigen Methode, aber sie werden derzeit sequenziell ausgeführt & daher wird die Anwendung blockiert bis zu dem Zeitpunkt, zu dem die Antwort/Daten für die vorherige Abfrage empfangen wurden, und dann zur nächsten Abfrage weitergegangen ist. Das mag ich nicht besonders. Ich möchte parallele Abfragen ausgeben.Mehrere Datenbankabfragen parallel für eine einzige Clientanforderung

Auch nach dem Ausgeben von Abfragen möchte ich einige andere Arbeit tun, (statt bis Antwort der vorherigen Abfragen blockiert) & auf die Antwort für jede Abfrage Ich möchte einen Code-Block für jede Abfrage Daten ausführen möchten. Wie soll man das machen?

Bearbeiten: Meine DB-API bietet Verbindungspooling.


Ich bin nur ein wenig vertraut mit Java Multithreading.

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

Dies ist eine Menge Feinheiten hier. Ich würde empfehlen, mit dem Lesen von Threading in Java zu beginnen: http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Gray

Antwort

-3

Hier ist ein sehr trivial/limited Ansatz:

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 
} 

Dies ist ein einfacher Ansatz, aber viele andere sind möglich (zB Thread-Pooling über Java Concurrency Aufgabe Testamentsvollstrecker, Frühling Aufgabe Testamentsvollstrecker, usw.) .

+1

Dies ist im Wesentlichen single-threaded, da Sie nur 1 Connection-Objekt haben , und der Hauptthread wartet (in der falschen Weise - sollte Join() verwenden) auf dem Anfragethread – ControlAltDel

+0

@ user1291492: Wenn diese Lösung falsch ist, könnten Sie einige Codebeispiele/Hinweise hinzufügen, wie Sie dies implementieren, in Ihrer Antwort? –

+0

Ich denke nicht, dass es fair ist zu sagen, dass dies single threaded ist. Seine "andere Arbeit" könnte leicht ausgeführt werden, während die Verbindung beschäftigt ist (vorausgesetzt, sie verwendet sie nicht). Letztendlich wird er wahrscheinlich mehr als eine Verbindung benötigen, um mit seinem Multiple-Threads-Szenario fertig zu werden, aber dies war ein grundlegendes Beispiel, keine vollständige Lösung. Ich stimme dem Vorschlag zu, Join anstelle von busy-wait am Ende zu verwenden, obwohl. – jsight

0

Sie verstehen sollten, bevor Sie dieses

  1. tun beginnen von Gleichzeitigkeit zu profitieren, müssen Sie mehrere db Verbindungen haben. Der beste Weg, dies zu lösen, ist ein Datenbankpool zu erstellen.

  2. Sie müssen eine runnable/callable-Klasse zum Ausführen einer db-Anweisung erstellen. Sie müssen ein Messaging-System zusammenstellen, um die Zuhörer darauf aufmerksam zu machen, wenn Ihre Anfrage abgeschlossen ist. Wenn Sie mehrere Anfragen gleichzeitig senden, sind alle Wetten deaktiviert, welche zuerst abgeschlossen werden sollen und welche nicht können Konflikte zwischen Aussagen sein, die Ihre App destabilisieren.

+0

Meine DB-Zugriffs-API bietet Verbindungspooling. Muss ich sicher sein, was zwischen mehreren Datenabfragen zuerst abgeschlossen wird? Kann es nicht so sein, dass alles, was zuerst ausgeführt wird, zur Ausführung seines spezifischen Codeblocks führt? –

0

Ich habe die ähnliche Aufgabe/Problem. Für ein vollständiges Build-Ergebnis muss ich wenige Anfragen für wenige verschiedene Dienste senden (wenige für REST, wenige für Thrift), um die Latenz zu verringern, muss ich sie parallel senden. Meine Idee ist es, java.util.concurrent.Future zu verwenden, einen einfachen Aggregationsmanager zu erstellen, der viele Anfragen zusammenstellt und die zuletzt abgerufene Antwort wartet und alle benötigten Daten zurückgibt. In einer fortgeschritteneren Lösung kann dieser Manager das Endergebnis während anderer Abfragen erstellen/kombinieren, aber diese Lösung kann nicht Thread-sicher sein.

Verwandte Themen