Multithreading mit Apache DBCP

8

Meine Anwendung führt mehrere Abfragen in mehreren Threads aus.

Im Moment erstelle ich eine neue Verbindung für jede Abfrage und möchte den Pool nutzen, um die Effizienz zu verbessern.

Kann der Apache-DBCP-Pool in mehreren Threads gleichzeitig funktionieren oder wird er bei einigen synchronisierten Methoden für jeden Thread "blockieren"?

Wenn es blockiert, kann ich etwas anderes verwenden?

AKTUALISIEREN

In diesem Artikel: Link angegeben:

  

Weil alle Oracle JDBC API-Methoden synchronisiert sind, wenn zwei Threads   versuche das Verbindungsobjekt gleichzeitig zu benutzen, dann wird es eines sein   gezwungen zu warten, bis der andere seine Verwendung beendet hat.

Ich denke, DBCP wird damit nicht umgehen können?

Ich merke auch, dass der Pool mir in diesem Szenario nicht helfen wird, da jeder Thread nach einer Verbindung fragt und der Thread jedes Mal eine neue Verbindung generiert (bis einige der Threads enden und die Verbindung zum Pool)

    
user1658192 09.09.2012, 14:01
quelle

2 Antworten

4

Ein Thread nimmt eine Verbindung aus dem Pool und nutzt sie exklusiv, bis sie fertig ist. Sie teilt die Verbindung nicht mit anderen Threads. Wenn es fertig ist, gibt es die Verbindung zum Pool zurück (normalerweise überschreibt die Verbindung die Methode close, um sie an den Pool zurückzugeben). Der Vorteil ist, dass die Verbindungen nicht für jede Verwendung neu erstellt werden müssen. Sie sollten jedoch nicht mehrere Threads verwenden, die gleichzeitig eine Datenbankverbindung verwenden.

    
Nathan Hughes 11.09.2012 15:05
quelle
2

Ja, Apache DBCP kann gleichzeitig in mehreren Threads arbeiten. "Blockieren" tritt auf, wenn der Client-Code getConnection() korrektes Verhalten unter Race-Bedingungen gewährleistet, z. B. sollte eine Connection -Instanz nicht durch zwei gleichzeitige getConnection() -Anforderungen erhalten werden. Danach behandelt der Client-Code die Connection -Instanzen.

Das gleichzeitige Szenario ist beim serverseitigen Pooling von großer Bedeutung, beispielsweise beim populären Apache-DBCP. Also denke ich, DBCP macht gutes Verhalten in Multi-Thread, obwohl ich nicht tief in die Bibliothek eintauche.

Und Apache DBCP stellt nur die JDBC-Verbindung pooling bereit, der Client-Code muss die Connection -Instanzen korrekt multi-threadsweise verwenden, was DBCP nicht garantieren kann.

    
卢声远 Shengyuan Lu 09.09.2012 14:13
quelle