사용 배경
실제 서비스 운영 환경에서는 우리가 개발한 자바 프로그램(웹 애플리케이션)과 데이터베이스는 서로 다른 시스템이다. 따라서 DB를 사용하기 위해 데이터베이스 드라이버와 URL을 이용해 커넥션을 생성한다.
이때, 자바 프로그램에서 DBMS로 커넥션을 생성하는 시간은 컴퓨터 입장에서는 매우 길기 때문에 DB 커넥션 생성은 전체 성능에 영향을 줄 수 있으며, 동시에 접속하는 사용자수가 많으면 사용자마다 DB 커넥션을 생성해서 DBMS에 부하를 준다.
DB 커넥션 획득 과정
1. 사용자가 WAS에 요청
2. 애플리케이션 로직이 DB 드라이버를 통해 커넥션 조회 요청
3. DB 드라이버가 DB에 TCP/IP 커넥션 연결
4. DB에 ID/PW와 같은 부가정보 전달(인증정보 전달)
5. 인증완료 시, DB 내부에 세션 생성
6. DB 커넥션 생성 및 DB 드라이버에 생성 완료 응답
7. DB 드라이버가 커넥션 객체를 생성하여 클라이언트에게 반환
이러한 DB 연결 비용을 줄이기 위해 사용하는 것이 커넥션 풀이다.
커넥션 풀
커넥션 풀은 애플리케이션 시작 시점에 일정한 개수 만큼 DB 커넥션을 미리 생성해두고, 애플리케이션에서 데이터베이스에 연결이 필요할 때마다 커넥션 풀에서 커넥션을 가져와 사용한 뒤 다시 풀에 반납한다. 커넥션 풀에 생성된 커넥션은 지속적으로 재사용된다.
✅ 커넥션의 상태
커넥션 풀은 커넥션을 생성하고 유지한다.
커넥션 풀에 커넥션을 요청하면 해당 커넥션은 활성(active) 상태가 되고, 커넥션을 다시 커넥션 풀에 반환하면 유휴(idle) 상태가 된다.
활성 상태가 가능한 최대 커넥션 개수를 지정할 수 있는데, 10개로 지정하게 되면 활성 상태 커넥션이 10개일 때 커넥션 풀에 다시 커넥션을 요청하면 다른 커넥션이 반환될 때까지 대기한다.
최대 대기 시간도 설정할 수 있는데, 이 시간 내에 풀에 반환된 커넥션이 있으면 해당 커넥션을 구하고 그렇지 않으면 익셉션이 발생한다.
✅ 커넥션 풀의 장점
커넥션을 미리 생성해두기 때문에 커넥션을 사용하는 시점에서 커넥션을 생성하는 시간을 아낄 수 있고, 동시 접속자가 많더라도 커넥션을 생성하는 부하가 적기 때문에 더 많은 동시 접속자를 처리할 수 있다. 또한, 커넥션도 일정 개수로 유지하여 DBMS에 대한 부하를 일정 수준으로 유지할 수 있게 해준다.
✅ 커넥션의 유지
한 커넥션이 영원히 유지되는 것은 아니고, DBMS 설정에 따라 일정 시간 내 쿼리를 실행하지 않으면 연결을 끊기도 한다.
DBMS 에서 10분 동안 쿼리를 실행하지 않으면 연결을 끊는 설정을 등록해두었을 때, 커넥션 풀에 특정 커넥션이 10분 이상 유휴 상태로 존재할 때 DBMS는 해당 커넥션의 연결을 끊지만 커넥션은 여전히 커넥션 풀 속에 남게 된다. 이 상태에서 해당 커넥션을 가져와 사용하면 익셉션이 발생할 수 있다.
이러한 문제를 방지하려면 커넥션 풀의 커넥션이 유효한지 주기적으로 검사가 필요하다.
✅ 커넥션 풀 제공 모듈
Tomcat JDBC, HikariCP, DBCP, c3p0
'데이터베이스' 카테고리의 다른 글
[MySQL] DB 연동 시 볼 수 있는 오류 해결 (0) | 2023.11.05 |
---|---|
[PostgreSQL] dual 과 같은 기능 사용하기 (0) | 2022.07.25 |
[Oracle] 오라클로 LIMIT 구현 하기 (0) | 2022.03.16 |
[프로그래머스] NULL 처리하기 (0) | 2021.11.28 |
[프로그래머스] 입양 시각 구하기(2) (0) | 2021.11.28 |