目录
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.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
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 23, 2024 pm 09:21 PM

  快手是一款很卓越的视频播放器,快手中的免密支付功能小伙伴们都非常熟悉,在日常生活中可以给我们很大的帮助,尤其是在平台中购买自己需要的商品时可以更好的去支付,我们现在要去取消掉该如何操作呢?怎么样才能真正有效取消掉免密支付功能?免密支付取消的方法非常简单,具体的操作方法已经整理好了,让我们一起到本站本站中来看整篇攻略吧,希望能够帮助到大家。快手关闭免密支付方法教程  1、打开快手app,点击左上角的三根横线。  2、点击快手小店。  3、在上面的选项栏中,找到免密支付并点击进去。  4、点击支

新浪新闻速递怎么关闭 关闭速递功能的操作步骤 新浪新闻速递怎么关闭 关闭速递功能的操作步骤 Mar 12, 2024 pm 09:46 PM

  新浪新闻软件内提供的新闻头条信息非常多,基本上都是官方平台推送的,每一篇新闻文章内容都是拥有真实性的,上下滑动一键搜索翻阅,整体的阅读氛围更加舒适。输入手机号在线登录,不同领域的新闻频道都是开放的,二十四小时更新都是不重复的,国内外、地方时事新闻都不会少的,上下滑动选择一键翻阅,新闻内容都是大家感兴趣的,还能关闭新闻速递功能,这样也不会被影响到,任何时候都可以打开一览,海量热门的新闻头条新鲜事抢先看,现在小编在线详细为新浪新闻用户们带来关闭速递功能的操作步骤。  找到新浪新闻进入,点击右下角

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安全中心实时保护的关闭方法。首先,让我们

如何在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、将杜比全景声后面的开关关闭即可。

拼多多怎么关闭先用后付的功能 拼多多关闭先用后付功能的方法 拼多多怎么关闭先用后付的功能 拼多多关闭先用后付功能的方法 Mar 12, 2024 pm 04:07 PM

  拼多多怎么关闭先用后付的功能?拼多多是一款非常智能的可以让用户在线上购买东西并且送货上门的软件,这个软件上面的商品的种类有非常多,用户可以在这上面选择自己需要的商品来购买,pdd为了能让用户更加方便的使用这个软件,就推出了一个先用后付的功能,很多用户想要取消掉这个功能,下面小编整理了取消先用后付功能的方法供大家参考。拼多多关闭先用后付功能的方法  在拼多多上面关闭  1、拼多多进入个人主页后,点击“设置”。  2、在设置中,点击“先用后付设置”。  3、

See all articles