Sie sollten immer eine separate Verbindung für separate Threads verwenden, da die Treiber auf diese Weise nicht Thread-sicher sind. Ein Verbindungspool könnte Ihnen helfen, da er die Wiederverwendung von Verbindungen auf sichere Weise ermöglicht.
Sie könnten auch ein Abfrage-Dispatch-Muster erstellen - wenn ich Ihr Problem richtig verstehe -, wo ein Thread für die Abfrage und Starts von N Threads verantwortlich ist, die die Datenbank aktualisieren können - die alle separate Verbindungsobjekte haben.
Sie können auch ein Batch-Update über das PreparedStatement betrachten zu tun, so Fäden auf sich in Bezug auf den Zeilen- und Tabellensperren stolpern nicht, die folgende Struktur verwendet:
- 1 Abfrage Thread
- NCPU Verarbeitungsthreads
- 1 Batch-Update-Thread
wie ein Mini-db gabel verbinden.
bearbeiten
Beispiele, wie man mit Pstmt Batch-Update zu tun:
PreparedStatement pstmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
for (int i = 0; i < 100; i++) {
pstmt.setInt(1, i * i);
pstmt.setInt(2, i);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
Oder Sie eine Warteschlange in der Schleife nicht abfragen, wo die Update-Anfragen von den Verarbeitungsthreads ankommen:
class WhatToUpdate {
public int id;
public int value;
}
Queue<WhatToUpdate> queue = new LinkedBlockingQueue<WhatToUpdate>();
PreparedStatement pstmt = connection.prepareStatement(
"UPDATE table SET field=? WHERE id=?");
int poisons = THE_NUMBER_OF_PROCESSING_THREADS;
while (true) {
WhatToUpdate record == queue.take();
if (record == null) { // poison pill
if (--poisons <= 0) {
break;
}
}
pstmt.setInt(1, record.value);
pstmt.setInt(2, record.id);
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
Danke !!! Ich habe einen Abfragethread und N Threads für die Verarbeitung. Wie kann ich eine Batch-Aktualisierung mithilfe einer vorbereiteten Anweisung durchführen? – Ngetha
Danke, das funktionierte perfekt für mich – Ngetha
@Ngetha: Wenn dies Ihre Frage beantwortet, * akzeptieren * die Antwort: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work (Das gleiche gilt für Ihre anderen Fragen.) –