느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라
article thumbnail
일반 제약회사에서 전산담당자로 있다가 2020년에 3년만에 다시 개발자로서 위메프라는 회사에 오게 되었는데
많은것이 바뀌어 있었다 스프링대신 스프링 부트를 쓰고있었고, 데이터베이스 관련해서는 모두 HikariDataSource라는 것을 사용하고 있었다. (마치 당연한 것 처럼)
개인적으로 이런걸 보면, 뭔가 누가만들었는지 알고싶고 해당 명칭을 지은 근원을 보고싶은법. 나는 히카리하면 개인적으로 가장 먼저 떠오르는게 옛날 아프리카TV의 BJ 히카리가 떠오른다.
해당 BJ가 일본인BJ였던 만큼 이 라이브러리를 만든 개발자도 일본과 관련이 있는 개발자가 아닐까 생각이 들었다. 

 

 

찾아보니 아니나 다를까 도쿄에 거주하고 있는 프로그래머였다. 

히카리CP를 만든 이유에 대한 글을 찾을 수 있었는데,( https://blog.jooq.org/tag/hikari/ )
 

Hikari – Java, SQL and jOOQ.

Welcome to the jOOQ Tuesdays series. In this series, we’ll publish an article on the third Tuesday every other month where we interview someone we find exciting in our industry from a jOOQ perspective. This includes people who work with SQL, Java, Open S

blog.jooq.org

 

이 개발자가 오픈소스 Connection Pool관련 프로젝트들을 받아서 필요한 부분들을 고치는 도중 쓸모없는 코드가 많았고, 자신이 만들면 더 빠르게 만들 수 있을것 같다는 내용이었던 것 같다.

 

왜 히카리라는 이름을 지었냐면 히카리는 빛이라는 뜻인데, 과거 인터뷰 기사를 보면 Hikari로 지은 이유에 대한 이야기
가 나온다. 빛(Hikari)처럼 빠르고 가벼움을 추구하기 위함이라고 한다. 여기서 말하는 가벼운이란 일종의 말장난 같은것
인데, 빛이 light이고 이게 가볍다라는 의미도 되는데, 최소한의 필요한 코드만 작성했다고 한다.
위의 이유들로 Hikari라 작명하였고 다익스트라의 다음 문구를 추구하고 있는것 같다. 
"간단함은 신뢰를 위한 선행조건이다."
   "Simplicity is prerequisite for reliability."
         - Edsger Dijkstra
 

HikariCP와 다른 풀의 성능테스트 사례

왼쪽것은  [ DataSource.getConnection()/Connection.close() ]를 한번의 Cycle로 나타낸걸로 같은시간대비 hikari가 가장많이 돌았다.


오른쪽 것은  [ Connection.prepareStatement(), Statement.execute(), Statement.close()]를 한번의 Cycler로 나타낸걸로 이역시 같은시간대비 hikaricp가 가장많이 돌았다. 

주요 속성

 

 

  • autoCommit : 풀에서 가져온 connection의 기본 자동커밋 동작을 제어합니다. 
    default : true
  • connectionTimeout : 클라이언트가 풀에서 연결을 기다리는 최대 시간으로 Connection 을 사용하려는 대기시간을 초과하면 SQLException이 발생합니다. 허용되는 가장 낮은 연결시간은 250ms입니다. Default: 30000(30초)
  • idleTimeout : 풀에서 일을하지 않고 커넥션을 유지하는 시간으로서 이 설정은 minimumIdle이 maximumPoolSize보다 작게 정의된 경우에만 적용됩니다. 풀이 minimumIdle(pool에서 유지하는 최소 커넥션 수)에 도달하면 Idle Connection이 중단되지않습니다. 
    연결이 유휴상태로 폐기되는지 여부는 최대 +30초 및 평균 +15초 변동이 적용됩니다.
    이 시간 초과 전에 연결이 유휴상태로 만료되지 않습니다. 값 0은 유휴 연결이 풀에서 제거되지 않음을 의미합니다.
    최소 허용값은 10000ms(10초)입니다. 기본값: 600000(10분)
  • keepAlivetime : DB또는 network인프라에 의해 시간초과되는 것을 방지하기 위해 HikariCP가 연결을 유지하려고
    시도하는 빈도를 제어합니다. 이 값은 maxLifetime값보다 작아야합니다. Keepalive는 Idle Connection에서만 발생합니다. 
  • maxLifetime : 이 속성은 풀에서 연결의 최대 수명을 제어합니다. 사용중인 연결은 절대 폐기되지 않으며 닫힐 때만 제거됩니다.
    연결별로 풀에서 대량 소멸을 방지하기 위해 약간의 음의 감쇠가 적용됩니다. 이 값을 설정하는 것이 좋습니다.
    이 값은 db또는 인프라에서 부과하는 연결 시간 제한보다 몇초 더 짧아야합니다. 값 0은 최대 수명이 없음을 나타내며
    물론 idleTimeout 설정에 따릅니다. 최소 허용 값은 30000ms(30초)입니다. 기본값: 1800000(30분)
  • minimumIdle : HikariCP가 풀에서 유지하려고 하는 최소 유휴 연결 수를 제어합니다. Default값은 maximumPoolSize와 같기 때문에
    은 성능을 원한다면 이 값을 건드리지 않는것이 좋음
  • maximumPoolSize : 이 속성은 idle Connection과 사용중인 connection을 모두 포함하여 풀이 도달할 수 있는 최대 크기를 제어합니다.
    기본적으로 이 값은 데이터베이스 백엔드에 대한 실제 연결 최대 수를 결정합니다. 풀이 이 크기에 도달하였는데 사용 가능한
    idle connection이 없으면 connectionTimeout을 초과하는 순간 Exception이 발생합니다.
profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!