ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring(7) - Connection Pool(Hikari)
    카테고리 없음 2021. 10. 13. 19:21
    반응형

    안녕하세요. 이번에는 커넥션 풀이라는 주제로 포스팅해보려고 합니다.

    아직 주니어 개발자라서 커넥션 풀 관리는 안해도 서비스가 잘 작동하기는 합니다.

    그러나 트래픽이 많은 서비스에서는 커넥션 풀이 아주 중요한 역할을 합니다.

    왜냐하면 커넥션 풀이 부족해서 클라이언트가 서비스를 이용 못하는 경우,

    커넥션 풀이 넘쳐나서 메모리가 초과되는 경우 등 다양한 문제가 발생할 수 있습니다.

    그래서 이번 기회에 커넥션 풀에 관해 공부해보겠습니다.

     

    Connection Pool(커넥션 풀)이란?

    커넥션 풀은 서버가 DB에 접근하기 위한 통로라고 생각하시면 됩니다.

    이러한 커넥션을 얻어와 SQL문을 직접 보내고 DB와 통신하게 됩니다.

    커넥션 풀 종류는 대표적으로 Tomcat-JDBC, HikariCP가 있습니다.

    Springboot 2.0버전 이하는 Tomcat-JDBC를 사용하고 있다가 2.0이상 버전부터는

    서버가 올라갈 경우 HikariCP를 같이 생성해주게 설정되어 있습니다.

     

    왜 커넥션 풀을 사용해야할까?

    일단 토이 프로젝트는 상관없지만

    주요 서비스들은 한 개의 트랜잭션만 실행되는 것이 아닌 여러 트랜잭션이 한꺼번에 실행되는 경우가 많습니다.

    이러한 상황을 해결하기 위해서 커넥션 풀트랜잭션 격리 레벨등을 사용합니다.

    커넥션들을 서버를 올릴 때 같이 만들어 놓고 사용하고 반납하는 방식으로 되어있습니다.

    그럼 HikariCP의 동작 방식에 대해서 알아보겠습니다.

     

     

    Hikari의 동작 방식

    Hikari에서는 dataSource라는 다양한 객체들을 이용하여 동작하게 됩니다.

    일단 서버 Application이 커넥션을 요청하게 됩니다.

    Connection con = DataSourceUtils.getConnection(dataSource);

    이렇게 요청을 하면 dataSource설정(.yml)에 따라서 맞는 DBMS에 접근할 수 있습니다.

    내부적으로 ConcurrentBag이라는 구조체를 이용해 Connection을 관리하게 됩니다.

    일단 스레드에서 요청이 들어오면 이 스레드가 Pool에 접근한 적이 있는지 확인합니다.

    그리고 사용한 적이 있으면 사용하던 커넥션을 아니면 다른 Idle커넥션을 찾아서 반납해줍니다.

     

    그리고 커넥션이 다 사용되고 나서는 HikariPool에 반납하게 됩니다. (con.close())

    그럼 어떻게 커넥션 풀을 설정 할 수 있는지 살펴보겠습니다.

     

    커넥션 풀 설정

    spring:
        datasource:
            hikari:
                connectionTimeout : 30000
                maximumPoolSize : 10
                maxLifetime : 1800000
                poolName : HikariCP

     

    connectionTimeout(ms)

    클라이언트가 커넥션을 얻을 때 대기하는 시간을 설정합니다.

    설정시간 초과 시 sqlException을 발생시키게 됩니다.

     

    maximumPoolSize

    커넥션 풀에 저장할 최대 커넥션 갯수를 지정해줍니다. 만약 connectionTimeout만큼 기다리다가

    커넥션을 얻지 못하는 경우에는 sqlException을 발생시킵니다.

     

    maxLifetime

    커넥션의 최대 유지시간을 뜻합니다.

     

    maxActive

    동시에 사용할 수 있는 커넥션의 갯수를 뜻합니다.

     

     

    위의 옵션이외에도 다양한 옵션을 이용해 적절한 커넥션을 받아올 수 있습니다.

    그래서 서비스에맞는 적절한 커넥션을 받아오는 것을 추천드립니다.

    너무 많이 받아 왔을 경우 너무 많은 메모리를 차지 할 수도있고

    너무 적게 받아오면 클라이언트가 접근을 못할 수도 있습니다.

    반응형

    댓글

Designed by Tistory.