connection pool이란?

모두·2025년 3월 11일

오늘은 MySQL 데이터 베이스의 connection pool 이라는 좀 더 딥한 개념에 대하여 글을 작성해보려 한다.

connection pool이란?

  • 데이터베이스와의 연결을 재사용하여 성능을 향상시키고, 리소스를 효율적으로 관리하는 방식
    • connection pool을 미리 정의하여 생성
    • application에서는 필요할때마다 생성된 pool에서 connection을 가져와서 사용

단일 connection 을 사용하게 되면 2개 이상의 쿼리문을 동시에 난리면 먼저 동작하여 반환되는 첫 번째 쿼리가 작동할 동안 두번째 쿼리는 대기를 해야한다.

그래서 그림처럼 만약 미리 4개의 connection 을 만들어 놓고 있다 3개의 쿼리문이 돌아가고 있는데 하나를 더 날려야 한다면 미리 만들어 져있던 connection 을 사용하여 동시에 처리할 수 있다. -> 효율적인 리소스 관리

connection 생성되는 시간 단축 가능

만약 (쿼리)SQL문을 실행할 때마다 id/password 를 인증해야(connection) 한다하면 MySQL Server 에서도 번거롭다.

  • 아는 애 인데 왜 자꾸 반복해

connection pool을 사용하게 되면 연결하고 인증하는 과정이 줄어들게 된다. 서버입장에서 인증된 애이기 떄문에 계속 사용하고 있다.

  • 서버 입장에서 메모리나 cpu 덜 씀, 물론 connection을 유지하는 리소는 필요함
  • 매번 Disk 에 있는 Data 를 비교해볼 필요가 없어짐

개발자 입장에서도 connection 을 매번 하기 위해 1 ~ 2 초 기다릴 필요가 없어져 편해짐

  • 그렇기에 connection pool을 사용하는 것이 리소스도 효율적으로 사용하고 응답속도도 빠르게 해줄 수 있다.

connection pool 단점

  • 정해진 connection pool 내에서만 사용 가능
  • connection이 close되어도 MySQL에선 IDLE 상태로 남아있음
    • connection을 재생성했을때 IDLE(대기) 상태의 connection을 같은 client 가 가져가는지는 알 수 없음
  • connection을 유지해야되는것도 MySQL에선 부담
  • MySQL의 reboot되면 connection pool도 재생성 필요
  • “쿼리의 크기 제한이 불가능”
    • connection 1개에서
      얼마나 큰 규모의 쿼리가 실행되는지 알 수 없음 (실제로 실행해야 알 수 있기 때문)

connection pool의 만약 4개를 미리 생성했는데 하다보니 쿼리문이 10개가 동시에 돌아가야 하는 상황이 발생한다면 connection pool을 더 늘릴려면 Application 에서 설정을 다시 바꿔야 한다.

  • Spring Application 서버를 내렸다가 다시 올리면서 connection pool을 추가로 생성해야 한다. -> 비효율적

  • Spring Application이 리부트 되면 기존에 연결된 connection 도 close 가 되었다 새로 떠야한다. connection이 다시 뜨더라도 닫았던 connection을 다시 가져갈 수 있느냐 마느냐는 MySQL 에서 결정 하는 것이기 때문에 이게 알 수가 없다.(닫는다 하더라도 실제로 닫이는지도 알 수 없다.)

  • MySQL 입장에서 connection 수를 무한히 들고 있을 수는 없다.그래서 보통 개수를 고정으로 지정하여 놓고 사용

    • 인증된 유저에 대해서만 connection을 유지해줘야 한다. session 체크를 계속 해줘야 한다.(부담이 된다)
  • DB가 죽었을 때 Application도 재시작 해야 connection pool이 재생성된다.

  • 쿼리의 크기가 제한이 불가능한 점이 가장 큰 단점인데

    • 예를 들어 악성유저가 특정 db에 100기가 짜리 데이터를 조회하려고한다. 그러면 유저 한명이 connection을 계속 오랫동안 물고 있는 상황이 발생
    • 만약 4개의 connection 을 만들었는데 4개가 전부 무거운 쿼리들 이면 뒤에 가벼운 쿼리들도 결과물을 리턴해줄 때 까지 계속 기다려야 한다. (실제 서버를 실행해야 지만 알 수 있음)

connection pool 관련 옵션(자주 쓰는 옵션)

  • maximumPoolSize: 최대 pool 사이즈
  • minimumIdle: pool에서 유지할 최소 IDLE pool 사이즈
  • connectionTimeout: connection 을 얻기까지 기다릴 최대 시간
  • idleTimeout: IDLE connection 이 pool에서 제거되기 전까지의 시간
  • maxLifetime: pool에서 제거될 시간

minimumIdle 사이즈를 지정을 안해주면 평소에도 maximumPoolSize 사이즈로 유지되어 디비에 부하가 간다.

0개의 댓글