HikariCP Pool Locking 케이스 스터디
HikariCP Deadlock 발생 케이스 및 해결방법을 정리한 내용입니다.
Pool Locking 발생 예시
환경 (가정)
- Thead Count: 8개
- MaximumPoolSize: 5개
- 한 쓰레드에서 생성되는 DB 커넥션 수: 2개
1) 모든 커넥션을 사용하는 상태
Pool에 Idle Connection이 없기 때문에 handOffQueue에서 5개 쓰레드가 대기 (※ C는 Connecting, W는 Waiting, T1~T8은 Thread)
- Connection Timeout이 되면 SQLTransientConnectionException 발생
- Exception이 발생하면 Transaction이 Rollback되면서 Connection Pool에 반납
┌────┬────┬────┬────┬────┬────┬────┬────┐
│ T1 │ T2 │ T3 │ T4 │ T5 │ T6 │ T7 │ T8 │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ C │ C │ C │ W │ W │ C │ C │ W │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ W │ W │ W │ │ │ W │ W │ │
└────┴────┴────┴────┴────┴────┴────┴────┘
Connection Pool 반납 이후, 두가지 Case 발생
2-1) T3가 Timeout나고 T1이 Connection 받는 경우 (Case 1)
기다리던 한 Thread가 운 좋게 커넥션을 받아내면 Transaction 완료
┌────┬────┬────┬────┬────┬────┬────┬────┐
│ T1 │ T2 │ T3 │ T4 │ T5 │ T6 │ T7 │ T8 │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ C │ C │ │ W │ W │ C │ C │ W │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ C │ W │ │ │ │ W │ W │ │
└────┴────┴────┴────┴────┴────┴────┴────┘
2-2) T3가 Timeout나고 T4가 Connection 받는 경우 (Case 2)
동일하게 Pool-locking 상태가 지속 (Timeout시 SQLTransientConnectionException 발생)
┌────┬────┬────┬────┬────┬────┬────┬────┐
│ T1 │ T2 │ T3 │ T4 │ T5 │ T6 │ T7 │ T8 │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ C │ C │ │ C │ W │ C │ C │ W │
├────┼────┼────┼────┼────┼────┼────┼────┤
│ W │ W │ │ W │ │ W │ W │ │
└────┴────┴────┴────┴────┴────┴────┴────┘
결론
운이 좋게 기다리던 쓰레드가 Connection을 받는경우 간헐적으로 성공하고 아닌경우 다시 5개 쓰레드가 대기상태에 빠지는 현상이 반복됩니다.
Pool Locking이 발생하지 않도록 Pool Size 설정이 필요합니다.
Pool Size 설정방법
Pool Locking이 걸리지 않는 최소 Pool Size 공식 (https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing)
The calculation of pool size in order to avoid deadlock is a fairly simple resource allocation formula:
pool size = Tn x (Cm - 1) + 1
Where Tn is the maximum number of threads, and Cm is the maximum number of simultaneous connections held by a single thread.
참고
반응형
'Dev > Etc' 카테고리의 다른 글
트러블 슈팅 툴 (0) | 2021.01.29 |
---|---|
덤프파일 생성방법 (0) | 2021.01.29 |
자가 서명 인증서 생성 (0) | 2020.03.03 |
정규표현식 (0) | 2019.08.04 |
콘솔 창 없이 배치파일 실행하는 방법 (0) | 2019.06.28 |