[ Hikari CP ] Hikari CP 란 무엇인가?

2024. 2. 25. 20:46Lang/JAVA

예전에 JPA를 처음 사용해 볼때 queryDSL이 적용이 안되서 JPA 관련 라이브러리를 뒤저본적 있다.

 

그때 JPA 라이브러리 안에서 우연히 보게 된 것이 Hikari 였다. 

 

이게 뭔지는 모르지만 JPA에 필요한 거구나 하고 넘겼지만 개발을 계속하면서 Hikari에 대한 이야기를 종종 듣게 되면서 

이번 기회에 공부해봤다.

 



Hikari CP란?

가볍고 빠른 JDBC 커넥션 풀링 프레임워크

 

예전에는 JDBC만으로 DB와 프로젝트를 연결하여 사용해 왔지만 매번 드라이버 로딩 - 연결 객체 생성 - 연결 - 종료 이 과정을 반복하다보니 서버의 리소스 소모가 심하고 다수의 DB 접속이 있을 경우 처리 속도도 떨어진다는 문제가 발생했다.

 

그래서 나온게 CP( Connection Pool )이다.

(ㄴ> 자세한 내용은 [CP] 커넥션 풀 (Connection Pool) 참고 )

 

Hikari도 역시 CP 중 하나로 매우 가벼운 무게(약 130kb)와 빠른 성능으로 Spring boot 2.0 이후엔 Default 옵션으로 채택 되었다.

(ㄴ> 그전까지는 tomcat-jdbc 를 사용 )



Hikari CP의 빠른 성능 이유

HikariCp가 다른 커넥션풀 관리 프레임워크보다 빠른 성능을 보여주는 이유는 커넥션풀의 관리 방법에 있다.

 

히카리는 Connection 객체를 한번 Wrappring한 PoolEntry로 Connection을 관리하며,
이를 관리하는 ConcurrentBag이라는 구조체를 사용하고 있다.

 

ConcurrentBag은

HikariPool.getConnection() -> ConcurrentBag.borrow()

라는 메서드를 통해 사용 가능한(idle) Connection을 리턴하도록 되어있다.

이 과정에서 커넥션생성을 요청한 스레드의 정보를 저장해두고 다음에 접근시 저장된 정보를 이용해 빠르게 반환을 해준다.

 

 ConcurrentBag.borrow() 과정 

 Thread 중 하나가 Hikari에 Connection 객체를 요청

-> 해당 Thread가 사용한 Connection 객체가 있는 지 pool을 확인

-> 있으면 해당 Connection을 주고, 없으면 다른 새 Connection을 찾는다.

-> 남은 Connection이 있으면 주고, 없으면 Thread는 Connection이 반납될 때까지  handoffQueue 대기

-> 30초 경과시 Exception 발생 (  HikariCP default Connection timeout == 30초 )

 

 

Connection 반납 과정

Thread가 HikariCP에서 얻은 Connection은 (ProxyConnection) Connection.close()를 하게 되면 HikariPool에 반납된다.
(HikariPool에서 얻은 Connection은 ProxyConnection 타입)


정상적으로 transaction이 commit 되거나, 에러로 인해 rollback이 호출 되면 connection.close()가 호출되어
Connection을 Pool에 반납

 

getConnection과 마찬가지로 connection.close() -> concurrentBag.requite()이 실행되며 Connection이 반납된다.

 

반납되면

poolEntry.setState(STATE_NOT_IN_USE)

로 다시 idle Connection으로 타입이 변경된다.

 

변경 후 handOffQueue에 Connection을 대기중인 Thread가 있으면 재할당 하고 없으면 pool에 안착한다.

위와 같이 전지적 개발자 시점 각본을 짜보겠습니다.

 

 

 

참고 사이트( https://techblog.woowahan.com/2664/ )

 

HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그

{{item.name}} 안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로 HikariCP에서 Dead lock이 발생할 수 있는 case와 Dead lock을 회피할

techblog.woowahan.com