자바 & 스프링

JDBC Connection pool은 왜 필요할까?

p829911 2021. 12. 1. 02:54

JDBC란?

Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 때 사용하는 API

  • DBMS 종류(MySql, MsSql, Oracle…)에 상관없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리할 수 있다.
  • JDBC 드라이버: 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터
  • JDBC 실행순서:
    1. JDBC 드라이버 로드
    2. Connection 객체 생성
    3. Statement 객체 생성
    4. Query 실행
    5. Result 객체로부터 데이터 추출
    6. Result 객체 Close
    7. Statement 객체 Close
    8. Connection 객체 Close

비용 이슈

DB와의 연결은 TCP 통신을 통해 이루어진다. TCP 통신은 연결할 때 3-way-handshake라는 과정을 거치고 연결을 끊을 때 4-way-handshake 과정을 거친다. 3-way-handshake는 3번의 패킷 교환을 통해 소켓을 형성하고 통신을 준비하는 과정을 의미하는데 이 과정이 쿼리를 요청할 때마다 반복적으로 실행된다면 네트워크 구간에서 병목의 원인이 될 수 있다. 

MySQL 8.0 Documentation : https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

mysql insert 문 수행 과정에서 connecting 비용이 3으로 비중이 가장 크다

  • Connecting: (3)
  • Sending query to server: (2)
  • Parsing query: (2)
  • Inserting row: (1)
  • Inserting index: (1)
  • Closing: (1)

관리상의 이점

DBCP(Database Connection Pool)가 존재하지 않는다면, DB를 사용하는 HTTP 요청이 들어오면 매번 위와 같은 단계를 거쳐 DB와 연결하게 된다. Connection Pool을 사용하게 되면 어플리케이션 서버가 실행될 때 미리 일정량의 DB Connection 객체를 생성하여 Pool 이라는 공간에 저장해두고 DB 연결 요청이 들어오면 Pool에서 Connection 객체를 가져다 쓰고 반환한다. 이 때문에 연결을 생성하고 끊는 작업에 대한 비용을 절약할 수 있게 되는 것이다.

 

Connection 객체는 직접적으로 메모리와 관련이 있기 때문에, 많이 사용하면 할 수록 메모리를 많이 점유하게 된다. 그렇다고 반대로 메모리를 위해 적게 지정한다면, 서버에서는 많은 요청을 처리하지 못하고 대기할 수밖에 없다.

WAS에서 사용하는 Thread 설정과 Connection Pool 설정을 적절하게 맞춰 성능 최적화를 시켜야 한다. 

예를 들어 WAS의 Thread수 > Connection Pool 수로 지정해야 한다 왜냐면 서버에 접근하는 모든 사용자들이 db에 접근하는 요청을 하지 않을 것이기 때문이다.

 

Connection Pool에 관련된 파라미터에는 다음과 같은 것들이 있다.

  • maxActive: 동시에 사용할 수 있는 최대 커넥션 수
  • maxIdle: Connection Pool에 반납할 때 최대로 유지될 수 있는 커넥션 개수
  • minIdle: 최소한으로 유지할 커넥션 개수
  • initialSize: 최초로 getConnection() method를 통해 커넥션 풀에 채워 넣을 커넥션 개수

주의

  • maxActive ≥ initialSize: 최대 커넥션 개수는 초기에 생성할 커넥션 개수와 같거나 크게 설정
  • maxActive = maxIdle: 같은 것이 바람직하다.
    maxActive: 10, maxIdle: 5일 때 항상 커넥션을 동시에 5개는 사용하고 있는 상황에서 1개의 커넥션이 추가로 요청된다면 maxActive: 10이므로 1개의 추가 커넥션을 DB에 연결한 후 Pool은 비즈니스 로직으로 커넥션을 전달한다. 이후 비즈니스 로직이 커넥션을 사용 후 풀에 반납할 경우, maxIdle: 5에 영향을 받아 커넥션을 실제로 닫아버리므로, 일부 커넥션을 매번 생성했다 닫는 비용이 발생할 수 있다.
  • maxActive값은 DBMS의 설정과 애플리케이션 서버의 개수, Apache, Tomcat에서 동시에 처리할 수 있는 사용자 수 등을 고려해서 설정해야 한다.

'자바 & 스프링' 카테고리의 다른 글

트랜잭션  (0) 2021.12.20
java - String, StringBuilder, StringBuffer  (0) 2021.12.08
java의 싱글톤  (0) 2021.12.01
PreparedStatement 쿼리를 사용하는 이유  (0) 2021.11.30
JPA allocationSize default 값이 50인 이유  (0) 2021.11.30