작성
·
373
0
4분50초 쯤에 con.close 호출돼서 커넥션 종료하는건 의미상 알겠는데 close가 직접적으로 명시된 코드를 찾으려고 했는데 안보이더라구요 이게 혹시 정확히 어디에 있는지 알 수 있을까요?
답변 2
2
안녕하세요. 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();
}
트랜잭션 동기화 매니저 정리
수동 커밋 → 자동 커밋 원복
커넥션 닫기
AbstractPlatformTransactionManager
추상 클래스 processCommit()
, processRollback()
메서드에서 마지막으로 각 구현체의 doCleanupAfterCompletion()
메서드를 호출하는 구조인 것 같습니다.
2
그렇군요 ㅎㅎ 찾아주셔서 감사합니다!