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中會自動執行這樣的檢查。
以上是DataSourceUitls的介紹及方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

360瀏覽器推薦的廣告如何關閉?相信很多的用戶都在使用360瀏覽器,不過這款瀏覽器有時候會彈出廣告,這就使得很多的用戶們都十分的苦惱,下面就讓本站來為用戶們來仔細的介紹一下如何關閉電腦360瀏覽器推薦的廣告吧。 如何關機360瀏覽器推薦的廣告? 方法一: 1、開啟360安全瀏覽器。 2、找到右上角「三橫槓」標誌,點選【設定】。 3、在彈出的介面左側工作列中找到【實驗室】,勾選【啟用「360熱點資訊」功能】即可。 方法二: 1、先雙擊

新浪新聞軟體內提供的新聞頭條資訊非常多,基本上都是官方平台推送的,每一篇新聞文章內容都是擁有真實性的,上下滑動一鍵搜尋翻閱,整體的閱讀氛圍更加舒適。輸入手機號碼在線上登錄,不同領域的新聞頻道都是開放的,二十四小時更新都是不重複的,國內外、地方時事新聞都不會少的,上下滑動選擇一鍵翻閱,新聞內容都是大家感興趣的,還能關閉新聞速遞功能,這樣也不會被影響到,任何時候都可以打開一覽,海量熱門的新聞頭條新鮮事搶先看,現在小編在線詳細為新浪新聞用戶們帶來關閉速遞功能的操作步驟。 找到新浪新聞進入,點選右下角

快手是一款很卓越的影片播放器,快手中的免密支付功能小夥伴們都非常熟悉,在日常生活中可以給我們很大的幫助,尤其是在平台中購買自己需要的商品時可以更好的去支付,我們現在要去取消掉該如何操作呢?怎麼樣才能真正有效取消掉免密支付功能?免密支付取消的方法非常簡單,具體的操作方法已經整理好了,讓我們一起到本站本站中來看整篇攻略吧,希望能夠幫助大家。快手關閉免機密支付方式教學 1、開啟快手app,點選左上角的三條橫線。 2、點選快手小店。 3、在上面的選項列中,找到免密付款並點擊進去。 4、點擊支

在Windows11作業系統中,安全中心是一個重要的功能,它可幫助使用者監控系統安全狀態、防禦惡意軟體和保護個人隱私。然而,有時使用者可能需要暫時關閉安全中心,例如在安裝某些軟體或進行系統調優時。本文將詳細介紹Windows11安全中心的關閉方法,協助您正確且安全地作業系統。 1.如何關閉Windows11安全中心在Windows11中,關閉安全中心並不

Windows作業系統作為全球用戶數量最龐大的作業系統之一,一直以來備受用戶青睞。然而,在使用Windows系統時,使用者可能會遇到許多安全隱患,例如病毒攻擊、惡意軟體等威脅。為了強化系統安全,Windows系統內建了許多安全保護機制,其中之一就是Windows安全中心的即時保護功能。今天,我們將會詳細介紹Windows安全中心即時保護的關閉方法。首先,讓我們

抖音是一款備受歡迎的短影片社群平台,讓使用者可以簡單地記錄生活、分享快樂。私訊功能在抖音中扮演著重要的角色,是使用者互動的主要方式之一。有時候,用戶可能會碰到對方關閉了私訊模式,導致無法傳送訊息的情況。一、抖音私訊對方關閉了私訊模式怎麼開啟? 1.確認對方是否開啟了隱私設置首先,我們應該確認對方是否啟用了隱私設置,可能已經限制了私訊的接收。如果他們設定了僅允許熟人私信,我們可以嘗試透過其他途徑聯繫他們,例如透過共同的朋友或在社群媒體平台上互動。 2.發送好友申請如果對方並未開啟隱私設置,那麼我們

Windows11是微軟公司最新推出的作業系統版本,相較於先前的版本,Windows11對系統安全性進行了更嚴格的管理和監控,其中一個重要的功能就是安全中心。安全中心可以幫助使用者管理和監控系統的安全狀態,確保系統不受惡意軟體和其他安全威脅的侵害。雖然安全中心對於保護系統安全很重要,但有時使用者可能會因為個人需求或其他原因希望關閉安全中心。本文將介紹如何在W

1.在手機設定中點選聲音與震動。 2、點選杜比全景音。 3.將杜比全景聲後方的開關關閉即可。
