강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

alrnr3521님의 프로필 이미지
alrnr3521

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 매니저2

커넥션 종료

작성

·

491

0

4분50초 쯤에 con.close 호출돼서 커넥션 종료하는건 의미상 알겠는데 close가 직접적으로 명시된 코드를 찾으려고 했는데 안보이더라구요 이게 혹시 정확히 어디에 있는지 알 수 있을까요? 

퀴즈

애플리케이션 계층 구조에서 서비스 계층을 순수하게 유지하려는 가장 중요한 이유는 무엇일까요?

UI 변경에 쉽게 대응하려고

데이터 저장 기술 변경에 쉽게 대응하려고

핵심 비즈니스 로직을 기술 종속 없이 관리하려고

성능 최적화를 위해

답변 2

3

안녕하세요. DataSourceTransactionManager 기준으로 doCleanupAfterCompletion() 메서드에서 진행하고 있네요.

@Override
protected void doCleanupAfterCompletion(Object transaction) {
	DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;

	// Remove the connection holder from the thread, if exposed.
	if (txObject.isNewConnectionHolder()) {
		TransactionSynchronizationManager.unbindResource(obtainDataSource());
	}

	// Reset connection.
	Connection con = txObject.getConnectionHolder().getConnection();
	try {
		if (txObject.isMustRestoreAutoCommit()) {
			con.setAutoCommit(true);
		}
		DataSourceUtils.resetConnectionAfterTransaction(
				con, txObject.getPreviousIsolationLevel(), txObject.isReadOnly());
	}
	catch (Throwable ex) {
		logger.debug("Could not reset JDBC Connection after transaction", ex);
	}

	if (txObject.isNewConnectionHolder()) {
		if (logger.isDebugEnabled()) {
			logger.debug("Releasing JDBC Connection [" + con + "] after transaction");
		}
		DataSourceUtils.releaseConnection(con, this.dataSource);
	}

	txObject.getConnectionHolder().clear();
}
  1. 트랜잭션 동기화 매니저 정리

  2. 수동 커밋 → 자동 커밋 원복

  3. 커넥션 닫기

AbstractPlatformTransactionManager 추상 클래스 processCommit(), processRollback() 메서드에서 마지막으로 각 구현체의 doCleanupAfterCompletion() 메서드를 호출하는 구조인 것 같습니다.

alrnr3521님의 프로필 이미지
alrnr3521
질문자

그렇군요 ㅎㅎ 찾아주셔서 감사합니다!

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. alrnr3521님

트랜잭션이 커밋되거나 롤백되는 곳 안에서 이런 것들이 발생합니다.

감사합니다.

alrnr3521님의 프로필 이미지
alrnr3521

작성한 질문수

질문하기