8

La mia applicazione esegue più query in più thread.Multithreading con Apache DBCP

In questo momento sto creando una nuova connessione per ogni query e desidero utilizzare il pool per migliorare l'efficienza.

Il pool Apache DBCP può lavorare contemporaneamente su più thread o "bloccherà" su alcuni metodi sincronizzati per ogni thread?

Se blocca, posso usare qualcos'altro?

UPDATE

In questo articolo: link dichiarato:

Poiché tutti i metodi API JDBC Oracle sono sincronizzati, se due fili tentano di utilizzare l'oggetto di connessione contemporaneamente, allora uno sarà costretto ad aspettare fino a quando l'altro finisce il suo uso.

Quindi suppongo che DBCP non sarà in grado di gestirlo?

Mi sto anche rendendo conto che in questo scenario il pool non mi aiuterà, poiché ogni thread richiederà una connessione e il thread genererà una nuova connessione ogni volta (fino a quando alcuni thread terminano e restituisce la connessione a la piscina)

+1

Per integrare le grandi risposte qui sotto, l'unica volta che 'getConnection()' può bloccare è se non ci sono più 'Connection' nel tuo pool (cioè: sono tutte le transazioni attualmente in esecuzione con il tuo database). Ma non appena una transazione è completata, il 'Connection' sarà restituito al tuo pool e' getConnection() 'restituirà un'istanza' Connection' valida. Anche se tutto ciò dipenderà dalla configurazione del tuo pool. – Jeach

risposta

2

Sì, Apache DBCP può lavorare in più thread contemporaneamente. Il "blocco" si verifica quando il codice client getConnection() garantisce un comportamento corretto in condizioni di competizione, ad esempio, un'istanza Connection non deve essere ottenuta da due richieste contemporanee di getConnection(). Dopo che il codice client gestisce le istanze Connection.

Lo scenario concorrente è un problema importante per il pooling del server, come ad esempio il popolare Apache DBCP. Quindi penso che DBCP funzioni bene in multi-thread, anche se non approfondisco la libreria.

E Apache DBCP solo fornisce connessione JDBC pool, il codice client deve utilizzare i Connection casi in modo corretto a più fili che DBCP non può garantire.

+0

Non sono sicuro se ho ragione, ma penso che alcuni dei metodi di PreparedStatement che i ritorni della connessione siano sincronizzati. In tal caso, la connessione verrà bloccata per thread ... – user1658192

+0

Non trovo alcun metodo in 'Connection' o 'Statement' è sincronizzato in JDBC. –

+0

Quindi non ci sono problemi con la stessa connessione in più thread, in cui ogni battistrada eseguirà query diverse? – user1658192

4

Un thread prende una connessione dal pool e ne fa uso esclusivo fino a quando non viene eseguito, non condivide la connessione con altri thread. Al termine, restituisce la connessione al pool (in genere la connessione sostituisce il metodo close per restituirlo al pool). Il vantaggio è che le connessioni non devono essere ricreate per ogni utilizzo. Ma non dovresti avere più thread che fanno uso simultaneo di una connessione al database.

+0

Ho voluto evitare di creare la connessione per filo per migliorare l'efficienza. In questo momento ogni thread crea la propria connessione. – user1658192

+0

@ user1658192 perché non chiamare getConnection() dall'origine dati DBCP invece di condividere l'istanza di Connection? –

+0

cosa succederà quando chiamo getConnection(), mentre la stessa connessione è già utilizzata da altri thread? Il sondaggio creerà una nuova connessione? – user1658192