Teilen Sie eine jdbc-Verbindung auf mehrere threads
Ich habe einen main-thread, der periodisch ausgeführt wird. Es öffnet sich eine Verbindung, mit setAutoCommit(false) auf, und übergeben als Verweis auf einige untergeordnete threads zu tun, die verschiedene Datenbank-lese/schreib-Operationen. Eine einigermaßen gute Anzahl von Operationen durchgeführt werden, wird in der child-threads. Nachdem alle untergeordneten threads abgeschlossen hatte Ihre db-Operationen, der Haupt-thread die Transaktion ein commit ausgeführt mit der geöffneten Verbindung. Bitte beachten Sie, dass ich die threads in den ExecutorService. Meine Frage, ist es ratsam, zu teilen, eine Verbindung über threads? Wenn "ja" sehen, ob der code unten ist richtig, es umzusetzen. Wenn "Nein", was sind andere Methode für die Durchführung einer Transaktion in multi-threaded-Szenario? Kommentare/beraten/eine-neue-Idee sind willkommen. pseudo-code...
Connection con = getPrimaryDatabaseConnection();
//let me decide whether to commit or rollback
con.setAutoCommit(false);
ExecutorService executorService = getExecutor();
//connection is sent as param to the class constructor/set-method
//the jobs uses the provided connection to do the db operation
Callable jobs[] = getJobs(con);
List futures = new ArrayList();
//note: generics are not mentioned just to keep this simple
for(Callable job:jobs) {
futures.add(executorService.submit(job));
}
executorService.shutdown();
//wait till the jobs complete
while (!executorService.isTerminated()) {
;
}
List result = ...;
for (Future future : futures) {
try {
results.add(future.get());
} catch (InterruptedException e) {
try {
//a jobs has failed, we will rollback the transaction and throw exception
connection.rollback();
result = null;
throw SomeException();
} catch(Exception e) {
//exception
} finally {
try {
connection.close();
} catch(Exception e) {//nothing to do}
}
}
}
//all the jobs completed successfully!
try {
//some other checks
connection.commit();
return results;
} finally {
try {
connection.close();
} catch(Exception e){//nothing to do}
}
Gibt es eine Frage hier? Wenn Sie möchten, code-review posten Sie bitte zu codereview.stackexchange.com
Würden Sie bitte erläutern, ein wenig mehr?
Sieht aus wie die während der Verbindung kann technisch thread-safe ist, Sie aber noch nicht, will es pass zwischen threads: stackoverflow.com/questions/1531073/...
Ich vergaß zu erwähnen, dass ein Punkt in meiner Frage, FYI, dieses Modul wird innerhalb des Jboss-5, wo der ServletContextListener beginnt der main scheduler-thread, und, noch wichtiger, den Faden Holen, die Verbindung von der konfigurierten datasource-pool.
InformationsquelleAutor Vijay Veeraraghavan | 2013-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde nicht empfehlen, Sie zu teilen, Verbindung zwischen threads, wie die Operationen, die mit der Verbindung ist ziemlich langsam und die Gesamtleistung von Sie Anwendung kann Schaden.
Ich würde eher empfehlen Ihnen Apache-Verbindungen-Pool und bieten separate Verbindung zu jedem thread.
Gut, können Sie verbindungen aus dem pool abgerufen, die in einigen gemeinsamen Sammlung, und tun, was Sie wollen, mit Ihnen nach threads die Ausführung beendet. Aber das ist eine sehr schlechte Art, die Verwaltung von Transaktionen. Ich würde lieber mit spring transaction manager zum Beispiel. Aber beachten Sie, dass es keine Transaktionen unterstützt innen-Testamentsvollstrecker-Aufgaben
Okay. Eher jeder worker-threads, Daten abrufen, verarbeiten und inserts in der Datenbank, ich möchte den Arbeiter, um alle Ihre verarbeiteten Daten aus dem Haupt-thread, so dass, wenn ich erhielt alle Ihre Objekte zu Recht, ich aktualisiere die Datenbank, alles in einer einzigen Verbindung, die Verbindung, die ich Holen aus dem pool.
Ja, das klingt gut für mich.
InformationsquelleAutor nkukhar
Könnte man erstellen Sie eine proxy-Klasse, die enthält die JDBC-Verbindung und bietet Zugang synchronisiert
. Die Gewinde sollten nie direkt auf die Verbindung.
Abhängig vom Einsatz und der Vorgänge, die Sie bieten, die Sie nutzen könnten
synchronized
Methoden oder sperren auf Objekte, wenn der proxy muss gesperrt werden, bis er die Blätter einem bestimmten Zustand.Für diejenigen, die nicht vertraut mit dem proxy design pattern. Hier die wiki-Artikel. Die grundlegende Idee ist, dass der proxy-Instanz verbirgt sich ein weiteres Objekt, bietet aber die gleiche Funktionalität.
InformationsquelleAutor mike
In diesem Fall erstellen Sie eine separate Verbindung für jeden worker. Wenn eine worker fehlschlägt, wird ein Rollback für alle verbindungen. Wenn alle übergeben, übergeben Sie alle verbindungen.
Wenn Sie gehen, um Hunderte von Arbeitern, dann müssen Sie synchronisiert den Zugriff auf die Connection-Objekte, oder verwenden Sie eine Verbindung, pool - @mike und @NKukhar vorgeschlagen.
InformationsquelleAutor Sam Barnum