Connection Pool이란? DBCP 연결 누수 문제 해결하기

Hannana·2024년 12월 1일

Cached crawled data into Redis with 10 minutes TTL.
2024-11-29T00:23:31.191+09:00 INFO 3056 --- [juseyo_be_crawl][nio-9090-exec-1] com.zaxxer.hikari.pool.ProxyLeakTask : Previously reported leaked connection com.mysql.cj.jdbc.ConnectionImpl@6fc28e5b on thread http-nio-9090-exec-1 was returned to the pool (unleaked)

에러가 떴다.
커넥션 풀에 대한 에러이다.
설정을 실제로 조정하니 에러는 해결됐는데
여기서 말하는 커넥션 풀에 대해 공부 겸 남기는 글.


DB커넥션 종류

-DB커넥션은 DB-애플리케이션 간 연결할 수 있는 수단을 말한다.
Driver와 Database 연결정보가 필요함.

  • 2Tier : 자바 프로그램이 클라이언트로서 직접 DB 서버에 접근하는 구조
  • 3Tier : 프로그램과 DB서버 사이에 미들웨어가 껴있는 구조
    (미들웨어는 기존에 클라이언트가 갖고있던 트랜잭션 처리, 리소스 관리의 영역을 맡게 됨)

DB커넥션 비용

  • 비용 측면
    -DBMS) DBMS는 매 요청을 처리하기 위해 Process 또는 Thread를 만든다.
    -네트워크) 하나의 연결이 일어나기 위해 DB는 특정 포트에서 계속 Listen을 하고 있다가 커넥션이 필요할 때마다 연결을 맺음
    -연결하는 과정 -> 3-way handshaking
    연결을 끊는 과정 -> 4-way handshaking
    -이같이 연결을 위해 실제 물리적인 네트워크 회선을 거쳐 이루어지기 때문에, 반복된다면 매우 비효율적일 것이다.

    3way handshaking

    4way handshaking

이러한 일반적인 DB커넥션의 한계와 비용 이슈를 해소할 수 있는 방법이
바로 커넥션 풀이다.

커넥션 풀이란?

데이터베이스와 연결을 열고 닫는 작업 시
매번 새 연결을 생성하는 대신, 미리 생성한 연결을 재사용하여 성능을 높인다.
일정 개수의 커넥션을 미리 만들어두고 만들어진 커넥션을 계속 재사용해서
연결마다 드는 부담을 줄일 수 있다.

  • 커넥션 풀링 : 미리 여러 개의 연결을 만들어 두고 필요할 때 가져다 쓰는 방식
    사용 후에는 연결을 닫는 대신 풀로 반환해서 다른 요청에서 재사용한다.

커넥션 풀 장점

-DB 접속 모듈을 공통화하여 유지보수에 유리
-DB Connection 수를 제한하여 과도한 접속으로 인한 서버 자원 고갈을 방지함
-DB Connection 객체를 미리 만들어 두어 접속 비용이 줄어든다.

HikariCP란?

HikariCP는 Spring Boot에서 기본적으로 지원하는 커넥션 풀 라이브러리다.
Spring Boot 2.x부터는 HikariCP가 기본 데이터소스 커넥션 풀로 설정되어
별도로 추가하지 않아도 사용할 수 있다는 것이 특징.

  • HikariCP는 Java 애플리케이션에서 DB 연결 효율성을 극대화하고 안정성을 보장해주는 라이브러리라고 볼 수 있다.
  • 이전에 사용하였던 Connection이 있으면 해당 Connection을 반환하는 것을 우선한다.

HikariCP는 어디서 사용되는가?

  • 웹 애플리케이션
    => 대량의 사용자 요청을 처리하는 환경에서 DB 연결을 효율적으로 관리하는 데 사용됨
  • 대규모 트래픽 서비스
    => 금융 서비스, 전자상거래 사이트와 같은 안정성이 중요한 서비스에서 사용됨
  • 마이크로서비스 아키텍처
    => 각 서비스가 독립적으로 데이터베이스에 연결해야 할 때 성능 최적화를 위해 사용됨

HikariCP 설정은 애플리케이션의 성능과 안정성을 보장하는 핵심 요소가 될 수 있다.


다시 에러로 돌아가보자.

Cached crawled data into Redis with 10 minutes TTL.
2024-11-29T00:23:31.191+09:00 INFO 3056 --- [juseyo_be_crawl][nio-9090-exec-1] com.zaxxer.hikari.pool.ProxyLeakTask : Previously reported leaked connection com.mysql.cj.jdbc.ConnectionImpl@6fc28e5b on thread http-nio-9090-exec-1 was returned to the pool (unleaked)

해석해보자면 이전에 보고 된 누수로 감지된 연결이 반환되었다는 말이다.
연결이 누수로 왜 감지되냐면
기본적으로 HikariCP는 connection leak detection이라는 기능을 제공하는데,
트랜잭션이 오래 걸리거나(기본값 30초 이상) 커넥션이 반환되지 않을 경우 경고를 출력한다.

나의 경우
데이터가 DB에 있는지 하나씩 체크하고 없는 데이터만 추려서 일괄로 DB에 insert하게끔 로직을 짰는데, 해당 작업에 트랜잭션을 달아놓으니
트랜잭션이 오래걸려서 경고가 뜬 것이었다.
그래서 다음과 같이 설정을 변경하였다.

  datasource:
    hikari:
      pool-name: HikariCP
      maximum-pool-size: 10 #풀 사이즈 : 10 -> 20으로 변경
      minimum-idle: 5
      idle-timeout: 30000
      max-lifetime: 1800000
      connection-timeout: 20000
      connection-test-query: SELECT 1
      leak-detection-threshold: 3000 #누수 감지 시간 : 3000(3초)-> 60000(60초)로 변경

HikariCP 누수 감지 시간과 커넥션 풀 사이즈를 조정하니
오류 없이 잘 돌아간다.

reference
https://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake
https://seongwon.dev/Database/20221002-DB_Connection_Pool/

profile
(구) https://hansjour.tistory.com/ 이사옴. 성장하는 하루를 쌓아가는 블로그

0개의 댓글