>  기사  >  Java  >  DataSourceUitls 소개 및 방법

DataSourceUitls 소개 및 방법

零下一度
零下一度원래의
2017-07-26 17:01:351795검색

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으로 문의하세요.