DBCP

DB Connection Pool. DB와의 커넥션 풀을 어플리케이션 단에 미리 만들어두는 것이다. DB와 커넥션을 맺고 끊기 위해 매번 TCP 통신하는 비용을 줄인다.

  • mysql 기준으로 성능에 중요한 설정
    • max_connections: 클라이언트와 맺을 수 있는 최대 커넥션 수
    • connect_timeout: 커넥션을 맺기 위해 기다리는 최대 시간(기본값 10초)
    • wait_timeout: inactive 커넥션을 얼마까지 기다린 뒤 close 할지 설정(기본값 28800 - 8시간). 연결을 맺고 다음 쿼리까지 기다리는 최대 시간
  • django 기준으로 성능에 중요한 설정
    • django는 커넥션 풀을 지원하지 않고, 요청마다 커넥션을 맺고 끊는다.
      • CONN_MAX_AGE: 하지만 CONN_MAX_AGE(default: 0)에 값을 주면, 커넥션을 지정한 시간 동안 종료하지 않아 커넥션 풀처럼 재사용이 가능하다.
    • 각 스레드는 고유한 커넥션을 갖는다. gunicorn 과 같은 서버를 이용하여 여러 스레드를 서빙하는 경우 그린 스레드(gevent) 조차 고유한 커넥션으로 연결된다.
      • 대규모 동시성이 필요한 경우, gunicorn의 worker_connection을 크게 설정한다.
      • db의 max_connections 를 더 크게 조정하면서 db의 부하를 살피거나
      • 커넥션 풀 라이브러리를 사용하여 불필요한 커넥션을 유지하는 비용을 줄일 수도 있다. 고유한 커넥션을 쓰지 말고 커넥션 풀에서 스레드가 커넥션을 가져다쓰는 방식으로 수정하는 것이다.

refs