-
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
동시에 사용할 수 있는 커넥션의 갯수를 뜻합니다.
위의 옵션이외에도 다양한 옵션을 이용해 적절한 커넥션을 받아올 수 있습니다.
그래서 서비스에맞는 적절한 커넥션을 받아오는 것을 추천드립니다.
너무 많이 받아 왔을 경우 너무 많은 메모리를 차지 할 수도있고
너무 적게 받아오면 클라이언트가 접근을 못할 수도 있습니다.
반응형