2012-09-13 12 views
5

Ha ottenuto la connessione db (conn) dal pool.è setautocommit (true) necessario dopo conn.commit()

Si supponga che autocommit sia TRUE su quella connessione.

Ora è impostato conn.setautocommit(false);

quindi dopo pochi aggiornamenti di dichiarazione e infine ha fatto.

Ora devo fare in modo esplicito il codice setautocommit(true) per ripristinare lo stato di connessione precedente?

OPPURE commit()\rollback() imposta automaticamente setautocommit(true)?

risposta

7

Dipende da dove hai ottenuto quella connessione. Se hai creato personalmente la connessione, non è necessario ripristinare lo stato del commit automatico.

Se è stato estratto da un'origine dati, è necessario ripristinare lo stato in quello che era perché l'origine dati potrebbe mantenere le connessioni in un pool e il prossimo pezzo di codice potrebbe non aspettarsi ciò che si imposta.

commit() non influenza il valore del commit automatico. L'abilitazione del commit automatico si limita a fare in modo che il driver JDBC chiami commit() dopo ogni istruzione che si esegue. Puoi comunque chiamare lo commit() tutte le volte che vuoi, ma non avrà alcun effetto (ad eccezione del fatto che lo rollback() non farà sempre quello che vuoi).

[EDIT] Il modo in cui viene eseguito il commit automatico dipende dal pool di connessioni. dbcp ha un'opzione di configurazione per disattivare il commit automatico prima di fornirti una connessione, c3p0 ripristinerà le connessioni quando tornerai al pool. Leggi la documentazione per il tuo pool di connessioni su come funziona.

Se non si conosce il pool utilizzato, la soluzione sicura è impostare il commit automatico su false ogni volta che si ottiene una connessione e per ripristinare la connessione se si ottiene un'eccezione. Vi suggerisco di scrivere un wrapper:

public <T> T withTransaction(TxCallback<T> closure) throws Exception { 
    Connection conn = getConnection(); 
    try { 
     boolean autoCommit = conn.getAutoCommit(); 
     conn.setAutoCommit(false); 

     T result = closure.call(conn); // Business code 

     conn.commit(); 
     conn.setAutoCommit(autoCommit); 
    } catch(Exception e) { 
     conn.rollback(); 
    } finally { 
     conn.close(); 
    } 
} 

Questo codice correttamente gestire la connessione per voi e non c'è bisogno di preoccuparsi più nel codice di business.

+0

Un pool di connessione è responsabile del ripristino dello stato autoCommit() delle connessioni restituite. Questa non è la responsabilità della persona che recupera la connessione. –

+0

@MarkRotteveel: riferimenti? –

+0

@AaronDigulla Potresti per favore elaborare "rollback() non farà sempre quello che vuoi"? –

0

conn.setAutoCommit (autoCommit); dovrebbe passare al blocco finally

Problemi correlati