찾다
Javajava지도 시간DataSourceUitls 소개 및 방법
DataSourceUitls 소개 및 방법Jul 26, 2017 pm 05:01 PM
connection폐쇄

DataSourceUitls 소개

DataSourceUitls 클래스는 org.springframework.jdbc.datasource 패키지에 있으며 javax.sql.DataSource에서 JDBC 연결을 얻기 위한 많은 정적 메서드를 제공하고 Spring 트랜잭션 관리를 지원합니다.

JdbcTemplate 클래스 내에서는 DataSourceUtils가 여러 번 사용됩니다. 실제로 Jdbc를 작동하기 위해 코드에서 직접 DataSourceUitls를 사용할 수도 있습니다.

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을 얻는 데 사용되는 핵심 메소드입니다. 소스 코드에서 현재 스레드에 바인딩된 연결이 없으면 새 연결이 생성된다는 결론을 내릴 수 있습니다. 현재 스레드의 트랜잭션 동기화가 활성화되면 Spring 트랜잭션 관리 지원이 연결에 추가됩니다. 현재 스레드에 해당 연결이 존재하는 경우 현재 트랜잭션 관리 할당이 있는 것입니다.

fetchConnection 메서드

fetchConnection은 공개되지 않는 비공개 메서드입니다. 실제로는 현재 DastaSource에서 새 연결을 생성하는 간단한 기능을 수행합니다. 생성이 실패하면 IllegalStateException이 발생하여 새 연결이 발생함을 나타냅니다. 얻을 수 없습니다.

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에 의해 처리됩니다. 예외가 발생하면 로그에서만 디버깅되며 외부에서는 발생하지 않습니다. 이 메서드의 두 매개변수는 모두 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이 아닌 경우 현재 Connection을 재사용할 수 있도록 이 ConnectionHolder가 보유하고 있는 현재 연결을 해제합니다. 이는 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 메소드에서는 데이터 소스가 NULL일 때 doCloseConnection 메소드가 실행된다는 것을 배웠습니다. 실제로 dataSource가 org.springframework.jdbc.datasource.SmartDataSource 인터페이스를 구현하지 않거나 dataSource가 org.springframework.jdbc.datasource.SmartDataSource 인터페이스를 구현하고 닫히도록 허용된 경우에만 Connection이 실제로 닫힙니다.

org.springframework.jdbc.datasource.SmartDataSource 인터페이스는 Jdbc 연결을 래핑되지 않은 형식으로 반환하는 javax.sql.DataSource 인터페이스의 확장입니다. 이 인터페이스를 구현하는 클래스는 작업을 완료한 후 연결을 닫아야 하는지 여부를 쿼리할 수 있습니다. 이러한 검사는 Srping, DataSourceUitls 및 JdbcTemplate에서 자동으로 수행됩니다.

위 내용은 DataSourceUitls 소개 및 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
win11快速启动有必要关闭吗win11快速启动有必要关闭吗Jun 29, 2023 pm 03:10 PM

win11快速启动有必要关闭吗?win11的快速启动可以帮助用户快速完成电脑开机,十分方便。但是也有不少用户认为正常启动比起快速启动,更能让电脑硬件进行充分休息。那么win11的快速启动和正常启动模式到底有什么区别呢?快速启动功能有必要进行关闭吗?今天小编就来给大家详细说明一下吧。win11快速启动和正常启动区别介绍快速启动就是你的电脑没有实现根本意义上的关机。电脑在关机或者休眠后,计算机的内存是无法存储文件的,所以电脑会将内存中的所有内容保存到硬盘中,生成一个指定的文件,而在唤醒休眠或者再次开

win10电脑如何关闭语音识别功能win10电脑如何关闭语音识别功能Jun 29, 2023 pm 05:07 PM

win10电脑如何关闭语音识别功能?相信有很多时候用户使用电脑时都会通过语音识别来快速的完成其他操作。不过也有部分用户在使用电脑的过程中不想要使用这个功能,那么我们要如何去关闭这个语音识别功能呢?下面就和小编一起来看看Win10关闭语音识别的攻略吧。Win10关闭语音识别的攻略1、在开始菜单单击鼠标右键,选择控制面板2、将控制面板【查看方式】修改为大图标,在下面点击语音识别3、点击左侧的高级语音选项4、将下面启动时运行语音识别前面的勾去掉,点击确定即可。

Win11怎样关闭445端口Win11怎样关闭445端口Jul 04, 2023 pm 12:17 PM

  Win11怎样关闭445端口?445号端口是一个TCP端口,是一个共享文件夹和打印机端口,在局域网内提供文件或打印机共享服务。近期有部分Win11用户想要关闭445端口,那么应该如何操作呢?很多小伙伴不知道怎么详细操作,小编下面整理了Win11关闭445端口的详细操作,如果你感兴趣的话,跟着小编一起往下看看吧!  Win11关闭445端口的详细操作  1、首先,按Win+S组合键,或点击底部任务栏上的搜索图标,打开的Windows搜索窗口,顶部输入Windows防火墙,然后点击系统给出的最佳

笔记本win7系统如何关闭触摸版笔记本win7系统如何关闭触摸版Jul 17, 2023 am 10:33 AM

有的用户在使用外接鼠标操作win7电脑的时候,左手老是不小心碰到触摸板导致操作失误,那么在win7系统笔记本如何关闭触摸板呢?下面一起来看看吧。1、打开电脑端底部的主菜单栏,选择如图的【控制面板】。2、进入到面板栏中,点击如图的【硬件和声音】选项。3、然后继续选择打开如图的【鼠标】选项。4、在上方菜单中,找到【触控板】选项,将其打开。5、在这里就可以调节设置触控板的设置属性了。6、将其取消选择,然后点击下方的应用确定,这样就可以关闭触控板了。以上笔记本win7系统关闭触摸板的操作大家学会了没有呢

CONNECTION_REFUSED什么意思CONNECTION_REFUSED什么意思Jul 31, 2023 pm 02:48 PM

CONNECTION_REFUSED是一种网络连接错误,通常会在试图连接到远程服务器时出现。当客户端设备试图建立一个与服务器的网络连接时,如果服务器拒绝该连接请求,就会返回一个CONNECTION_REFUSED错误。常见的原因包括:服务器未启动、服务器无法接受更多的连接请求、服务器防火墙阻止了该连接等。

connection error怎么解决connection error怎么解决Nov 07, 2023 am 10:44 AM

解决方法:1、检查网络连接;2、检查服务器状态;3、清除缓存和Cookie;4、检查防火墙和安全软件设置;5、尝试使用其他网络等等。

如何停用Win7交互式服务检测?如何停用Win7交互式服务检测?Jun 30, 2023 am 09:33 AM

win7交互式服务检测怎么关闭?各位在使用电脑的过程中,是否有遇到过交互式服务检测这一提示窗口呢?该窗口一般都是由于病毒入侵导致的系统自动防护所引起的,因此我们需要对其十分重视,各位在关闭其之前,最好对电脑进行一次全面杀毒,那么,我们究竟要怎么关闭交互式服务检测这一窗口呢?下面就由小编为大家带来win7交互式服务检测关闭方法。win7交互式服务检测关闭方法1、首先按下左下角的“开始”按钮,然后在弹出的菜单窗口里点击“控制面板”选项。2、把“管理工具”打开后,接下来再点击“服务”。3、接着找到名为

Win7怎么关闭3D加快?Win7关掉3D加快的方式Win7怎么关闭3D加快?Win7关掉3D加快的方式Jul 07, 2023 pm 04:29 PM

尽管说3D加快可以让视觉冲击有一定的提高,但3D加快作用十分占有运行内存,许多朋友要想关掉这一作用却不知怎么实际操作,那麼碰到这样的情况该怎么办呢?下边就和小编一起来看一看是如何解决的吧。Win7关掉3D加快的方式1、按住“win+r”键盘快捷键,开启运行窗口键入“dxdiag”按回车键开启DirectX确诊专用工具。2、随后将页面转换到“表明”查询,就可以查询到系统软件是不是打开3d加快。3、随后退回到桌面,再度按“win+r”键盘快捷键,开启运行窗口键入“regedit”按回车键开启注册表编

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구