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}
}
connection-Objekt ist nicht threadsicher, teilen Sie es mehrere threads gibt, die Probleme verursachen können
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

Schreibe einen Kommentar