Ho il bean di origine dati inizializzato nel contesto di primavera. Mi chiedo in che modo dovrebbe essere usato? Perché non riesco proprio a scrivere dataSource.getConnection()?DataSourceUtils.getConnection vs DataSource.getConnection
risposta
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.
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.
Quindi se ho una transazione in esecuzione e ottengo una connessione tramite 'dataSource.getConnection()' quella connessione non sarà legata alla transazione corrente? –
- 1. comportamento Connection - DriverManager.getConnection() e DataSource.getConnection()
- 2. ID vs UniqueID vs ClientID vs UniqueClientID vs StaticClientID?
- 3. VS 2008 vs VS 2008 Express
- 4. .NET vs ASP.NET vs CLR vs ASP
- 5. Atomikos vs JOTM vs Bitronix vs?
- 6. Accumulare vs piega vs ridurre vs comprimere
- 7. ACE vs Boost vs Poco vs wxWidgets
- 8. VS 2013 MSTest vs nUnit vs xUnit
- 9. control.BeginInvoke() Vs Dispatcher Vs SynchronizationContext Vs .. - AFFIDABILITÀ
- 10. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
- 11. bigtable vs cassandra vs simpledb vs dynamo vs couchdb vs hypertable vs riak vs hbase, cosa hanno in comune?
- 12. e vs * e | vs +
- 13. SpiderMonkey vs JavaScriptCore vs?
- 14. * vs ** vs *** in Proguard?
- 15. bundler vs RVM vs gemme vs RubyGems vs gemsets vs system ruby
- 16. Misurare il tempo in Linux - tempo vs orologio vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?
- 17. innerText vs innerHtml vs label vs text vs textContent vs outerText
- 18. Mathematica: non valutata vs Defer vs attesa vs HoldForm vs HoldAllComplete vs etc etc
- 19. Iterator vs. Reference vs. pointer
- 20. Selenium vs. SimpleTest vs. WatiN
- 21. BasicHttpBinding vs WsHttpBinding vs webHttpBinding
- 22. Boo vs C# vs Python?
- 23. StringBuffer vs StringBuilder Vs StringTokenizer
- 24. JSF vs Facelets vs JSP
- 25. Qcodo vs. CakePHP vs. Zend
- 26. select vs poll vs epoll
- 27. RazorEngine vs RazorTemplates vs RazorMachine
- 28. cudaStreamSynchronize vs CudaDeviceSynchronize vs cudaThreadSynchronize
- 29. Bitmap vs ImageView vs Drawable
- 30. gruntjs vs yeoman vs guard
Quindi se ho una transazione in esecuzione e ottengo una connessione tramite 'dataSource.getConnection()' quella connessione non sarà legata alla transazione corrente? –
@mishanesterenko No, dataSource.getConnection() restituirà sempre una connessione 'fresca' direttamente dal database o dal pool senza alcuna transazione attiva. – mrembisz
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. –