2012-03-29 11 views
5

Per completare determinate richieste dall'utente, nella mia applicazione, sto emettendo più query DB da un singolo metodo, ma sono attualmente eseguite sequenzialmente & quindi l'applicazione è bloccata fino al momento in cui ha ricevuto la risposta/i dati per la query precedente, quindi passare alla query successiva. Questo non è qualcosa che mi piace molto. Vorrei inviare query parallele.Richieste multiple di database in parallelo, per una singola richiesta client

anche dopo l'emissione query Vorrei fare qualche altro lavoro, (invece di essere bloccati fino risposta query precedente) & su come ottenere la risposta per ogni query vorrei eseguire un blocco di codice specifico per i dati di ogni query. Qual è il modo di fare questo?

Modifica: la mia API DB fornisce il pool di connessioni.


Sono solo un po ' familiarità con Java multithreading.

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

Questo è un sacco di complessità qui. Ti consiglio di iniziare facendo un bel po 'di lettura sul threading in Java: http://docs.oracle.com/javase/tutorial/essential/concurrency/ – Gray

risposta

-3

Ecco un banale/approccio limitato:

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 
} 

Questo è un approccio semplice, ma molti altri sono possibili (ad esempio, messa in comune filo tramite Java Concorrenza esecutori di attività, esecutori compito Primavera, ecc) .

+1

Questo è essenzialmente single-threaded, come hai solo 1 oggetto Connection , e il thread principale attende (nel modo sbagliato - dovrebbe usare join()) sul thread di richiesta – ControlAltDel

+0

@ user1291492: Incaso questa soluzione è sbagliato, potresti aggiungere alcuni esempi di codice/suggerimenti su come implementare questo, nella tua risposta? –

+0

Non penso che sia giusto dire che questo è single threaded. Il suo "altro lavoro" potrebbe facilmente essere fatto mentre la connessione è occupata (supponendo che non la usi). In definitiva, probabilmente avrà bisogno di più di una connessione per gestire il suo scenario con più thread, ma questo è stato un esempio di base, non una soluzione completa. Sono d'accordo con il suggerimento di usare join invece di busy-wait alla fine, però. – jsight

0

Si dovrebbe capire prima di iniziare a fare questo

  1. Per beneficiare di concorrenza, è necessario disporre di più connessioni db. Il modo migliore per risolvere questo è creare un pool db.

  2. È necessario creare una classe eseguibile/richiamabile per l'esecuzione di una dichiarazione db. Dovrai mettere insieme un sistema di messaggistica per avvisare gli ascoltatori quando la query è completata

  3. Capire che quando si inviano più richieste allo stesso tempo, tutte le scommesse sono spente su quale verrà completata per prima, e che lì potrebbero essere conflitti tra dichiarazioni che destabilizzano la tua app.

+0

L'API di accesso al mio DB fornisce il pool di connessioni. Devo essere sicuro di ciò che tra più query di dati verrà completato prima? Non è come se tutto ciò che è stato completato prima porti all'esecuzione del suo specifico blocco di codice? –

0

Ho il compito/problema simile. Per i risultati di compilazione completi, ho bisogno di inviare poche richieste per pochi servizi diversi (pochi su REST, pochi su Thrift), per ridurre la latenza ho bisogno di inviarlo in parallelo. La mia idea è usare java.util.concurrent.Future, creare un semplice gestore di aggregazioni, che crea molte richieste insieme e aspetterà l'ultima risposta recuperata e restituirà tutti i dati necessari. In una soluzione più avanzata questo gestore può creare/combinare il risultato finale durante altre query, ma questa soluzione può non essere thread-safe.

Problemi correlati