-
Notifications
You must be signed in to change notification settings - Fork 300
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
jdbc 4단계 폴로 미션 제출합니다. #592
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 폴로!
ConnectionManager를 이용한 부분이 인상 깊었네요! 덕분에 저도 아이디어를 얻은 것 같습니다 ㅎㅎ
코드를 잘 작성해주셔서 리뷰드릴 부분이 별로 없었어요.
적절히 셀렉하여 반영해주시고 pr 한번 더 보내주시면 마지하도록 하겠습니다~
return connection; | ||
public static ConnectionManager getConnection(final DataSource dataSource) throws CannotGetJdbcConnectionException { | ||
final ConnectionManager manager = TransactionSynchronizationManager.getResource(dataSource); | ||
if (!isNull(manager)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
isNull이란게 Objects 클래스에서 static 메서드로 제공해주는 것이군요!
들어가보니 isNull 바로 아래에 nonNull이란 것이 있던데, !로 한번 부정해주는것보다는 nonNull을 쓰는 것이 어떨까요?
private <R> R execute(final Supplier<R> transactionSupplier) { | ||
final ConnectionManager connectionManager = DataSourceUtils.getConnection(dataSource); | ||
try { | ||
connectionManager.activeTransaction(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
메서드 명이 동사로 시작하도록 active, inactive대신 activate, inactivate를 써보는게 어떨까요?
if (connectionManager.isTransaction()) { | ||
return; | ||
} | ||
final ConnectionManager releasedManager = TransactionSynchronizationManager.unbindResource(dataSource); | ||
if (connectionManager.hasSameConnection(releasedManager)) { | ||
connectionManager.close(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hasSameConnection이라는 것을 판단할 필요가 있을까요?
트랜잭션에 있는게 아니라면 바로 close해줘도 괜찮지 않을까요?
TransactionSynchronizationManager의 필드는 다음과 같아서 동일한 데이터소스에 대해 여러개의 커넥션이 존재할 순 없을 것 같다고 생각이 됩니다. HashMap이니까용
private static final ThreadLocal<Map<DataSource, ConnectionManager>> resources = withInitial(HashMap::new);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음 저도 사실 하면서 이게 필요한가 라는 생각을 하긴 했는데요.
제가 불안이 높은 사람이라 안하고 불안해하는 것보다 하는게 낫지않나 싶어서 그냥 해버렸습니다ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그렇다면 예외를 던져서 뭔가가 잘못되고았음을 알려주는 것이 어떤가요!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
나도 모르는 새에 커넥션이 안닫히고 누수되는 것을 방지하기 위함이지요
public void transact(final Runnable runnable) { | ||
Connection connection = null; | ||
try { | ||
connection = connectionAgent.getConnectionAndSave(); | ||
connection.setAutoCommit(false); | ||
execute(() -> { | ||
runnable.run(); | ||
connection.commit(); | ||
return null; | ||
}); | ||
} | ||
|
||
public <T> T transact(final Supplier<T> supplier) { | ||
return execute(supplier); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
중복을 잘 제거해주셨네요 굿
} | ||
|
||
public static void bindResource(DataSource key, Connection value) { | ||
public static void bindResource(final DataSource key, final ConnectionManager value) { | ||
resources.get().put(key, value); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그리고 여기서 이미 key를 contains하고 있다면 예외를 던져주면 안전할 것 같아요!
동일한 datasource에 대해 굴러온 value가 박힌 value를 없애버리는 상황을 방지하기 위해....
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
빛의 속도로 피드백 반영을 해주셨군요!! 👍👍👍👍
이번 미션은 여기까지 하도록 하겠습니다 고생하셨어요~!
다음 미션도 화이팅입니당💪💪💪💪💪
금방 다시 만나게 됐네요.
step3 에서 step4로 넘어오면서
ConnectionHolder 의 역할을 TransactionSynchro~에게
ConnectionAgent 의 DatasourceUtils 에게 넘겼습니다.
그런데 이렇게 하고보니까. 이 구조에선 이게 트랜잭션인지 아닌지 구분을 어떻게하지… 싶더라구요
그래서 connection을 필드로 갖고있는 ConnectionManager을 만들었습니다.
boolean 하나 두고 트랜잭션인지 아닌지 껐다 키고 하려구요.
isTransaction이 true 인경우는 transaction이 진행중이라 close가 되지 않게 했습니다.
4단계도 잘 부탁드려요 이리내~~~