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

alrnr3521님의 프로필 이미지

작성한 질문수

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

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

커넥션 종료

22.07.10 14:09 작성

·

356

0

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

답변 2

2

Seunghoon Choi님의 프로필 이미지

2022. 11. 21. 21:31

안녕하세요. 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
질문자

2022. 11. 23. 08:17

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

2

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

2022. 07. 17. 14:41

안녕하세요. alrnr3521님

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

감사합니다.