2012-03-10 5 views

risposta

13

C'è una differenza importante: dataSource.getConnection() restituisce sempre una nuova connessione ottenuta dal dataSource o dal pool di connessioni. DataSourceUtils.getConnection() controlla se è presente una transazione attiva per il thread corrente. Se ce n'è uno, restituirà la connessione con questa transazione. Se non ce ne sono, si comporterà esattamente allo stesso modo di dataSource.getConnection().

È necessario prestare attenzione quando si utilizza DataSourceUtils.getConnection(). Se restituisce la connessione per la transazione attiva, significa che qualcun altro la chiuderà poiché è responsabilità di chiunque abbia aperto la transazione. D'altra parte, se restituisce una nuova connessione da dataSource, sei tu a dover eseguire il commit/rollback/chiuderlo.

+1

Quindi se ho una transazione in esecuzione e ottengo una connessione tramite 'dataSource.getConnection()' quella connessione non sarà legata alla transazione corrente? –

+1

@mishanesterenko No, dataSource.getConnection() restituirà sempre una connessione 'fresca' direttamente dal database o dal pool senza alcuna transazione attiva. – mrembisz

+1

Da javadoc di 'DataSourceUtils.releaseConnection()' afferma: "Chiudi la connessione data, ottenuta dalla DataSource fornita, se non è gestita esternamente (cioè, non è legata al thread)." Ciò suggerirebbe che è sempre sicuro chiamare questo metodo dopo aver terminato di utilizzare la connessione (ottenuto da 'DataSourceUtils.getConnection()') e non richiede alcuna conoscenza se la connessione abbia partecipato o meno a una transazione effettiva. –

2

DataSourceUtils#getConnection() documenta chiaramente il motivo per cui si consiglia di utilizzarlo: in particolare, utilizza la gerarchia di eccezioni JDBC Spring rispetto alle eccezioni SQL raw e parteciperà alla funzione di gestione delle transazioni di Spring. Se non hai bisogno di una di queste due funzionalità, puoi semplicemente usare DataSource#getConnection() e andare avanti con il tuo codice.

+1

Quindi se ho una transazione in esecuzione e ottengo una connessione tramite 'dataSource.getConnection()' quella connessione non sarà legata alla transazione corrente? –

Problemi correlati