目錄
DataSourceUitls介紹
DataSourceUitls取得Connection
getConnection方法
內部實作
doGetConnection方法
fetchConnection方法
DataSourceUitls釋放Connection
releaseConnection方法
doReleaseConnection方法
DataSourceUitls關閉Connection
doCloseConnection方法
首頁 Java java教程 DataSourceUitls的介紹及方法

DataSourceUitls的介紹及方法

Jul 26, 2017 pm 05:01 PM
connection 關閉

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

360瀏覽器推薦的廣告如何關閉?如何關閉電腦360瀏覽器推薦的廣告? 360瀏覽器推薦的廣告如何關閉?如何關閉電腦360瀏覽器推薦的廣告? Mar 14, 2024 am 09:16 AM

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

新浪新聞速遞怎麼關閉 關閉速遞功能的操作步驟 新浪新聞速遞怎麼關閉 關閉速遞功能的操作步驟 Mar 12, 2024 pm 09:46 PM

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

快手怎麼關閉免機密支付 快手關閉免機密支付方法教學 快手怎麼關閉免機密支付 快手關閉免機密支付方法教學 Mar 23, 2024 pm 09:21 PM

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

Windows 11安全中心關閉方法詳解 Windows 11安全中心關閉方法詳解 Mar 27, 2024 pm 03:27 PM

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

Windows安全中心即時保護關閉方法詳解 Windows安全中心即時保護關閉方法詳解 Mar 27, 2024 pm 02:30 PM

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

抖音私訊對方關閉了私訊模式怎麼開啟?私訊對方關閉了私訊模式看得到嗎? 抖音私訊對方關閉了私訊模式怎麼開啟?私訊對方關閉了私訊模式看得到嗎? Mar 28, 2024 am 08:01 AM

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

如何在Windows 11中關閉安全中心 如何在Windows 11中關閉安全中心 Mar 28, 2024 am 10:21 AM

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

opporeno5去哪關閉杜比全景聲_禁用opporeno5杜比全景聲方法 opporeno5去哪關閉杜比全景聲_禁用opporeno5杜比全景聲方法 Mar 25, 2024 pm 04:41 PM

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

See all articles