Replies: 1 comment
|
Notion은 코드가 말을 안듣는군요... |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
MemberRepositoryV3DataSourceUtils.getConnection()
getConnection()에서DataSourceUtils.getConnection()를 사용하도록 변경된 부분을 특히 주의해야 한다.DataSourceUtils.getConnection()는 다음과 같이 동작한다.DataSourceUtils.releaseConnection()
close() 에서 DataSourceUtils.releaseConnection()을 사용하도록 변경된 부분을 특히 주의해야 한다. 커넥션을 con.close() 를 사용해서 직접 닫아버리면 커넥션이 유지되지 않는 문제가 발생한다. 이 커넥션은 이후 로직은 물론이고 트랜잭션을 종료(커밋, 롤백) 할 때까지 살아있어야 한다. > DB연결이 종료되기 때문에 살아있어야 한다.
DataSourceUtils.releaseConnection()을 사용하면 커넥션을 바로 닫는 것이 아니다.
트랜잭션 매니저를 사용하는 서비스 코드를 작성해보자
MemberServiceV3_1private final PlatformTransactionManager transactionManagerDataSourceTransactionManager구현체를 주입 받아야 한다.JpaTransactionManager를 주입 받으면 된다.transactionManager.getTransaction()TransactionStatus status를 반환한다. 현재 트랜잭션의 상태 정보가 포함되어 있다. 이후 트랜잭션을 커밋, 롤백할때 필요하다.new DefaultTransactionDefinition()transactionManager.commit(status)transactionmanager.rollback(status)MemberServiceV3_1Test초기화 코드
new DataSourceTransactionManager(dataSource)DataSource가 필요하다.트랜잭션 매니저 1 - 트랜잭션 시작

클라이언트의 요청으로 서비스 로직을 실행한다.
transactionManager.getTransaction()를 호출해서 트랜잭션을 시작한다.트랜잭션 매니저2 - 로직 실행

DataSourceUtils.getConnection()을 사용해서 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내서 사용한다. 이 과정을 통해서 자연스럽게 같은 커넥션을 사용하고 트랜잭션도 유지한다.트랜잭션 매니저3 - 트랜잭션 종료

con.setAutoCommit(true)로 되돌린다. 커넥션 풀을 고려해야 한다.con.close()를 호출해서 커넥션을 종료한다. 커넥션 풀을 사용하는 경우con.close()를 호출하면 커넥션 풀에 반환된다.정리
DataSourceTransactionManager에서JpaTransactionManager로 변경해주면 된다.java.sql.SQLException이 아직 남아있지만, 이 부분은 뒤에 예외 문제에서 해결출처
All reactions