dev💻/백엔드 및 DB

HikariCP와 DB Connection Pool의 이해

귤랑귤랑 2024. 10. 4. 22:57
Spring Boot 사용하면서 자연스럽 접하게 되는 HikariCP 커션 풀(Connection Pool)로, 그 원리를 깊게 이해하지 못 채 사용 했습니다. 최근 웹서핑 중 HikariCP에서 발생할 수 있는 데드락 문제 대한 글 읽고, 이를 정리았습니다.

1. DB Connection Pool이?

DB Connection Pool WAS(Web Application Server)와 DB(Database) 사이 연결을 미 생성하여 Pool 보관하고, 이를 재사용하여 데이터를 교환하는 방식입니다. 이는 연결을 매번 새로 생성하는 대신, 미 생성된 연결을 재사용함으로써 성능을 향니다.
 
2. Connection Pool의 필요
WAS DB 연결은 비용이 많이 드 작업입니다. 커넥션을 위해 3-way handshaking을 통해 소 생성하고, 여러 번 패킷 교이 필요합니다. 쿼리마다 이 작업 반복하면 네트워크 병 현상이 발생 수 있습니다. 이를 해결하기 위해, 미 정 개수 커넥션 만들어 Pool에 보하고 관리하며 재사용합니다. 이를 통해 반복적인 3-way handshaking을 방하고 빠 통 가능합니다.
3. Connection Pool 동작 원

 

 

 

  • 넥션 획: WAS의 Thread Connection 요청하면, Connection Pool 이용 가능한(Idle) 커넥 반환합니다. HikariCP 경우, 이전 사용한 적 있는  적으로 반환합니다.

 

 

 

  • : 사용 가능한 션이 없으면, HandOffQueue에서 하며 다른 Thread 커넥 반환하기 기다립니다. 이, Connection Pool 크기가 으면 대기하는 Thread가 많 성능 하되고, 경우에 따라 Deadlock 발생할 수 있습니다. 이를 하기 위해 Pool 크기를 해야 합니다.

 

 

4. Connection Pool 사이즈 결정

Connection Pool의 크기를 늘리면 성능 및 Deadlock 문제를 피 수 있지만, 필요 이상의 메모리를 사용하게 됩니다. 또한, Disk I/O Thread의 Context Switching 등의 이유로 증가에도 한계 있습니다.
 

 

  • Disk I/O: 하드스크의 성 받쳐 못하면 blocking 발생할  있습니다.

 

 

 

  • Context Switching: 멀 레드 환경에서 Thread의  인해 성능 증가를 기대하기 어렵습니다.

 

HikariCP에서는 Deadlock 피하기 위한 최소 Pool Size 정 때, Thread 갯수 동시에 필요한 커 수를 고려 공식을 제공합니다. 그러나 이 수치는 절대이지 않으며, 시스템 따라 달라 수 있습니다. 따라서 성 테스트를 통해 적 사이 찾아야 합니다.
 
4-1. Simultaneous Connection
 

 

  • @GenerationType.IDENTITY : 한  넥션이 필요합니다.

 

 

 

  • @GeneratedValue(strategy = GenerationType.AUTO) : 두 개 션이 필요합니다.

 

 

Connection Pool 서버와 DB 연결 재사용하여 연결에 드 비용을 최소하기 위한 방식입니다. Pool 크기가 작으면 대시간이 길 성능 저하가 발생하며, 크기가 너무 크 메리를 낭비하게 됩니다. 적 Pool Size를 찾 위해 성 테스트가 필요합니다.

하지만 정리해보, 틀린 내용 있다면 댓글로 알려주시 바랍니다:D