DataSourceUitls 클래스는 org.springframework.jdbc.datasource 패키지에 있으며 javax.sql.DataSource에서 JDBC 연결을 얻기 위한 많은 정적 메서드를 제공하고 Spring 트랜잭션 관리를 지원합니다.
JdbcTemplate 클래스 내에서는 DataSourceUtils가 여러 번 사용됩니다. 실제로 Jdbc를 작동하기 위해 코드에서 직접 DataSourceUitls를 사용할 수도 있습니다.
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으로 균일하게 캡슐화한다고 말할 수 있습니다.
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은 공개되지 않는 비공개 메서드입니다. 실제로는 현재 DastaSource에서 새 연결을 생성하는 간단한 기능을 수행합니다. 생성이 실패하면 IllegalStateException이 발생하여 새 연결이 발생함을 나타냅니다. 얻을 수 없습니다.
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이 될 수 있습니다.
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인 경우 연결을 직접 닫도록 선택하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!