DataSourceUitls的介绍及方法
DataSourceUitls介绍
DataSourceUitls类位于org.springframework.jdbc.datasource包下,提供了很多的静态方法去从一个javax.sql.DataSource下获取JDBC Connection,并且提供了对Spring 事务管理的支持。
在JdbcTemplate类的内部,DataSourceUtils被多次使用。其实,我们还可以在代码中直接使用DataSourceUitls来操作Jdbc。
DataSourceUitls获取Connection
getConnection方法
内部实现
public static Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException { try { return doGetConnection(dataSource); } catch (SQLException ex) { throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection", ex); } catch (IllegalStateException ex) { throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection: " + ex.getMessage()); } }
可以看出,通过传入一个指定的DataSource,可以获取一个Connection,获取过程由doGetConnection方法实现。如果抛出SQLException和IllegalStateException,则将其包装成CannotGetJdbcConnectionException,事实上也只能抛出SQLException和IllegalStateException这两种异常。通过查看CannotGetJdbcConnectionException的源代码,我们可以发现CannotGetJdbcConnectionException实际上是DataAccessException的子类,因此可以说,getConnection会将抛出的异常统一封装成Spring的DataAccessException。
doGetConnection方法
内部实现
public static Connection doGetConnection(DataSource dataSource) throws SQLException { Assert.notNull(dataSource, "No DataSource specified"); ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) { conHolder.requested(); if (!conHolder.hasConnection()) { logger.debug("Fetching resumed JDBC Connection from DataSource"); conHolder.setConnection(fetchConnection(dataSource)); } return conHolder.getConnection(); } // Else we either got no holder or an empty thread-bound holder here. logger.debug("Fetching JDBC Connection from DataSource"); Connection con = fetchConnection(dataSource); if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering transaction synchronization for JDBC Connection"); // Use same Connection for further JDBC actions within the transaction. // Thread-bound object will get removed by synchronization at transaction completion. ConnectionHolder holderToUse = conHolder; if (holderToUse == null) { holderToUse = new ConnectionHolder(con); } else { holderToUse.setConnection(con); } holderToUse.requested(); TransactionSynchronizationManager.registerSynchronization( new ConnectionSynchronization(holderToUse, dataSource)); holderToUse.setSynchronizedWithTransaction(true); if (holderToUse != conHolder) { TransactionSynchronizationManager.bindResource(dataSource, holderToUse); } } return con; }
doGetConnection方法是用于实际操作获取Connection的核心方法。从源代码中可以得出,如果不存在与当前线程绑定的Connection,则新建一个全新的Connection,如果当前线程的事务同步处于活动状态,那么为刚刚创建的Connection添加Spring事务管理的支持;如果当前线程存在一个相应的Connection,那么则有当前的事务管理分配。
fetchConnection方法
fetchConnection是一个private方法,不对外公开,实际上是做了一个简单的功能:从当前的DastaSource新建一个Connection,如果新建失败,那么抛出IllegalStateException,提示不能获取一个新的Connection。
DataSourceUitls释放Connection
releaseConnection方法
内部实现
public static void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) { try { doReleaseConnection(con, dataSource); } catch (SQLException ex) { logger.debug("Could not close JDBC Connection", ex); } catch (Throwable ex) { logger.debug("Unexpected exception on closing JDBC Connection", ex); } }
releaseConnection方法的具体实现由doReleaseConnection处理。如果抛出异常,仅仅是在日志中做debug处理,不会对外抛出。该方法的两个参数均存在NULL的情况,
如果con为NULL,则忽略本次调用;而另一个参数则被允许为NULL。
doReleaseConnection方法
内部实现
public static void doReleaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) throws SQLException { if (con == null) { return; } if (dataSource != null) { ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && connectionEquals(conHolder, con)) { // It's the transactional Connection: Don't close it. conHolder.released(); return; } } logger.debug("Returning JDBC Connection to DataSource"); doCloseConnection(con, dataSource); }
doReleaseConnection方法是真正释放了Connection的方法,与releaseConnection方法相比,则完成了对传入的两个参数的校验和抛出更底层的异常。在dataSource不为NULL的情况下,释放此ConnectionHolder保留的当前连接,使得该当前的Connection可以得到复用,对提供Jdbc操作的性能很有帮助。如果dataSource为null的情况下则选择直接关闭连接。
DataSourceUitls关闭Connection
doCloseConnection方法
内部实现
public static void doCloseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException { if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) { con.close(); } }
在doReleaseConnection方法中,我们已经得知当datasource为NULL的时候会执行doCloseConnection方法。事实上,只有dataSource没有实现org.springframework.jdbc.datasource.SmartDataSource接口的时候或者dataSource实现了org.springframework.jdbc.datasource.SmartDataSource接口且允许关闭的时候,在真正关闭了Connection。
org.springframework.jdbc.datasource.SmartDataSource接口是 javax.sql.DataSource接口的一个扩展,用一种未包装的形式返回Jdbc的连接。实现该接口的类可以查询Connection在完成操作之后是否应该关闭。在Srping和DataSourceUitls和JdbcTemplate中会自动执行这样的检查。
Atas ialah kandungan terperinci DataSourceUitls的介绍及方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Bagaimana untuk mematikan iklan yang disyorkan oleh 360 Browser? Saya percaya bahawa ramai pengguna menggunakan Pelayar 360, tetapi pelayar ini kadangkala memaparkan iklan, yang membuatkan ramai pengguna sangat tertekan Biarkan tapak ini memperkenalkan dengan teliti kepada pengguna cara untuk Mematikan iklan yang disyorkan oleh Pelayar 360 pada komputer anda. Bagaimana untuk mematikan iklan yang disyorkan oleh 360 Browser pada komputer anda? Kaedah 1: 1. Buka 360 Safe Browser. 2. Cari logo "tiga bar mendatar" di penjuru kanan sebelah atas dan klik [Tetapan]. 3. Cari [Makmal] dalam bar tugas di sebelah kiri antara muka pop timbul, dan tandakan [Dayakan fungsi "360 Hotspot Information"]. Kaedah 2: 1. Klik dua kali pertama

Kuaishou ialah pemain video yang sangat baik Fungsi pembayaran tanpa kata laluan di Kuaishou sangat dikenali oleh semua orang. Ia boleh membantu kami dalam kehidupan seharian, terutamanya apabila membeli barangan yang kami perlukan di platform . Sekarang kita perlu membatalkannya. Bagaimana kita boleh membatalkan fungsi pembayaran tanpa kata laluan dengan berkesan itu bersama-sama. Mari kita lihat keseluruhan panduan di laman web ini, saya harap ia dapat membantu semua orang. Tutorial tentang cara menutup pembayaran tanpa kata laluan di Kuaishou 1. Buka aplikasi Kuaishou dan klik pada tiga garisan mendatar di sudut kiri atas. 2. Klik Kuaishou Store. 3. Dalam bar pilihan di atas, cari pembayaran tanpa kata laluan dan klik padanya. 4. Klik untuk menyokong

Perisian Sina News menyediakan banyak maklumat tajuk berita, yang pada asasnya didorong oleh platform rasmi Kandungan setiap artikel berita adalah sahih Anda boleh meleret ke atas dan ke bawah untuk mencari dan menyemak imbas dengan satu klik, menjadikan suasana bacaan keseluruhan lebih selesa . Masukkan nombor telefon mudah alih anda untuk log masuk dalam talian Saluran berita dalam medan yang berbeza dibuka menyemak imbas. Kandungan berita adalah semua Jika anda berminat, anda juga boleh mematikan fungsi ekspres berita, supaya ia tidak akan terjejas Anda boleh membukanya pada bila-bila masa dan pratonton tajuk berita besar-besaran Sekarang editor akan menyediakan butiran kepada pengguna Sina News dalam talian Langkah-langkah operasi fungsi penghantaran ekspres. Cari Berita Sina dan klik pada sudut kanan bawah

Dalam sistem pengendalian Windows 11, Pusat Keselamatan ialah fungsi penting yang membantu pengguna memantau status keselamatan sistem, mempertahankan daripada perisian hasad dan melindungi privasi peribadi. Walau bagaimanapun, kadangkala pengguna mungkin perlu mematikan Pusat Keselamatan buat sementara waktu, seperti semasa memasang perisian tertentu atau melakukan penalaan sistem. Artikel ini akan memperkenalkan secara terperinci cara untuk mematikan Pusat Keselamatan Windows 11 untuk membantu anda mengendalikan sistem dengan betul dan selamat. 1. Bagaimana untuk mematikan Pusat Keselamatan Windows 11 Dalam Windows 11, mematikan Pusat Keselamatan tidak

Sebagai salah satu sistem pengendalian dengan bilangan pengguna terbesar di dunia, sistem pengendalian Windows sentiasa digemari oleh pengguna. Walau bagaimanapun, apabila menggunakan sistem Windows, pengguna mungkin menghadapi banyak risiko keselamatan, seperti serangan virus, perisian hasad dan ancaman lain. Untuk mengukuhkan keselamatan sistem, sistem Windows mempunyai banyak mekanisme perlindungan keselamatan terbina dalam, salah satunya ialah fungsi perlindungan masa nyata Pusat Keselamatan Windows. Hari ini, kami akan memperkenalkan secara terperinci cara mematikan perlindungan masa nyata dalam Pusat Keselamatan Windows. Mula-mula, mari

Windows 11 ialah versi sistem pengendalian terkini yang dilancarkan oleh Microsoft Berbanding dengan versi sebelumnya, Windows 11 mempunyai pengurusan dan pemantauan keselamatan sistem yang lebih ketat. Pusat Keselamatan boleh membantu pengguna mengurus dan memantau status keselamatan sistem untuk memastikan sistem dilindungi daripada perisian hasad dan ancaman keselamatan lain. Walaupun Pusat Keselamatan penting untuk melindungi keselamatan sistem, kadangkala pengguna mungkin mahu mematikan Pusat Keselamatan kerana keperluan peribadi atau sebab lain. Artikel ini akan memperkenalkan cara menggunakan W

1. Klik Bunyi dan Getaran dalam tetapan telefon. 2. Klik Dolby Atmos. 3. Matikan suis di belakang Dolby Atmos.

Bagaimana untuk mematikan penggunaan sekarang, fungsi bayar kemudian pada Pinduoduo? Pinduoduo ialah perisian yang sangat pintar yang membolehkan pengguna membeli barangan secara dalam talian dan menghantarnya ke pintu mereka Terdapat banyak jenis produk pada perisian ini Pengguna boleh memilih produk yang mereka perlukan untuk membolehkannya untuk pengguna menggunakan perisian ini, fungsi gunakan sekarang bayar kemudian telah dilancarkan Ramai pengguna ingin membatalkan fungsi ini Editor di bawah telah menyusun kaedah untuk membatalkan fungsi gunakan sekarang bayar kemudian untuk rujukan anda. Bagaimana untuk mematikan penggunaan sekarang, bayar kemudian pada Pinduoduo Matikannya pada Pinduoduo 1. Selepas memasuki halaman utama Pinduoduo, klik "Tetapan". 2. Dalam tetapan, klik "Gunakan sekarang, bayar kemudian tetapan". 3.
