2024. 2. 25. 17:40ㆍ기술정보
CP
(Connection pool )
데이터베이스 연결을 효율적으로 관리하기 위한 소프트웨어 엔지니어링 패턴
1. 개념
- 웹 컨테이너(WAS)가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 오면 Connection 객체를 빌려주고 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법이다.
- Container 구동 시 일정 수의 Connection 객체를 생성하게 되며 클라이언트의 요청에 의해 애플리케이션이 DBMS 작업을 수행해야 하면, Connection Pool에서 Connection 객체를 받아와 작업을 진행한다. 이후 작업이 끝나면 Connetion Pool에 Connection 객체를 반납한다.
2. 등장 배경
커넥션 풀(Connection Pool)의 등장 배경은 데이터베이스 연결의 비용과 효율성에 연관이있다.
데이터베이스 연결은 상당히 비싼 작업으로, 매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료한다. 이러한 비효율성을 해결하기 위해 CP가 등장했다.
커넥션 풀은 웹 컨테이너(WAS)가 실행되면서 DB와 미리 연결을 해놓은 객체들을 풀에 저장해두었다가, 클라이언트 요청이 오면 이를 빌려주고, 처리가 끝나면 다시 풀에 반환하는 방식을 사용한다.
이렇게 함으로써 매번 연결을 생성하고 종료하는 비용을 줄일 수 있다.
3. 문제점
커넥션 풀은 DBC 과정을 단축시켜서 리소스 소모를 감소시켜주고 처리속도도 빠르게 해주지만 완벽하지는 않다.
커넥션 풀의 크기는 동시에 처리가능한 연결 개수를 의미한다. 커넥션 풀이 미리 DB 연결을 한 connection 객체를 생성해 두지만 application이 필요로하는 개수보다 부족한 경우에는 DB 연결 지연을 발생시킨다.
( -> 이 문제점은 DB Pool 과 DB Active 를 확인해 보면 알 수 있다. )
참고 : https://docs.whatap.io/best-practice-guides/about-apm-dbc
DB 연결 지연과 커넥션 풀 | WhaTap Docs
애플리케이션 성능 장애 유형 중 하나인 DBC 지연 문제와 Connection Pool에 대해 안내합니다.
docs.whatap.io
=> 해결법
1) Connection Pool 크기 조절
: Pool의 최대 연결 개수를 조절하는 방법
- Pool을 점차 늘려 DB Active 개수가 Pool 최대치 내에서 유지되는 것을 확인해 적절한 Pool 개수를 설정하는 것
- 하지만 Pool의 개수를 지나치게 크게 지정한 경우 자원 소비량의 과도한 증가로 오히려 애플리케이션 성능에 악영향
- 충분한 메모리와 처리 능력을 갖추고 있는지 확인 후 각자의 운영 환경에 알맞게 조절해야 함
2) Connection 재활용 및 최적화
- Connection 사용 후 명시적으로 반환하도록 설정하거나 재사용하는 방식을 적용
- ex) 애플리케이션이 사용한 Connection을 반환하지 않아 Connection Leak**이 발생한 경우, ->
Connection Pool의 개수를 늘린다고 해결할 수 없다. Connection Leak을 막기 위해서는 사용한 Connection을 반드시 반환하도록 관리해야 한다.
[ -> Connection Leak**
: 데이터베이스 연결이 제대로 닫히지 않거나 커밋되지 않아서 결국 연결이 포기되고 영구적으로 닫히는 상황
- 일반적으로 코드의 오류나 메모리 누수로 인해 발생
- 데이터베이스 연결이 증가하고 데이터베이스가 중단될 수 있음
ex) 풀에서 연결을 가져온 후에 close()를 호출하여 명시적으로 닫지 않으면 연결 누수가 발생할 수 있음
ㄴ> 연결 누수는 애플리케이션의 성능을 저하시키고, 데이터베이스에 부담을 주므로 코드에서 식별하고 수정해야 한다. ]
+ DB 연결 LifeCycle
- 데이터베이스 드라이버를 사용하여 데이터베이스 연결 열기
- 데이터를 읽고 쓰기 위해 TCP 소켓 열기
- TCP 소켓을 사용하여 데이터 통신
- 데이터베이스 연결 닫기
- TCP 소켓 닫기
요약
>> Connection 객체를 생성하는 과정
① 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회한다.
② DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
③ DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
④ DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
⑤ DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
⑥ DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
→ DB 연결할 때마다 Connection 객체를 새로 만드는 것은 비용이 많이 들며, 굉장히 비효율적이다.
>> DB 연결의 효율성 증대 방법 -> CP
이러한 문제를 해결하기 위해 애플리케이션 로딩 시점에 Connection 객체를 미리 생성하고, 애플리케이션에서 데이터베이스에 연결이 필요할 경우 미리 준비된 Connection 객체를 사용하여 애플리케이션의 성능을 향상하는 커넥션 풀 (Connection Pool)이 등장하게 된다.
'기술정보' 카테고리의 다른 글
[클라우드 네이티브] 개념 정리 (1) | 2024.02.13 |
---|---|
[ Docker ] Docker Container vs Virtual Machine (1) | 2024.01.31 |
[ AI ] 언어모델 (0) | 2023.12.26 |
[ AI ] 머신러닝 vs 딥러닝 (0) | 2023.12.26 |
[ JWT ] JWT를 활용한 로그인 (0) | 2023.11.27 |