일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- spring
- JPA
- 이스티오
- gradle
- thread
- GC
- 백준
- 스프링
- 토비의 스프링
- OS
- 자바 ORM 표준 JPA 프로그래밍
- MSA
- IntellJ
- Real MySQL
- jvm
- redis
- Stream
- SpringBoot
- 스트림
- Java
- 보조스트림
- K8s
- 자바
- mysql
- 쿠버네티스
- list
- Stack
- Kotlin
- 토비의 스프링 정리
- Collection
- Today
- Total
인생을 코딩하다.
[DB, NETWORK] 커넥션 풀을 사용하지 않았을때 발생하는 "비용"은 구체적으로 어떤 비용일까? 본문
Connection Pool을 사용하지 않으면, DB 서버 접속을 위한 과정을 HTTP요청이 있을 때마다 DB서버에 지속적으로 접근하는 작업이 반복적으로 필요하다.
DB서버에 최초로 연결하여 Connection 객체를 생성는 작업은 비용적인 측면에서 큰 성능 저하를 이야기 한다. 이것이 반복되면 더 큰 성능 저하를 불러온다.
이와 같은 문제를 사전에 방지하기 위해 사용하는것이 바로 Connection Pool이다.
Connection Pool은 WAS 실행시 일정량의 Connection 객체를 미리 생성하여 Pool 이라는 공간(캐시)에 저장해둔다. 그리고 DB연결 요청이 있을때 마다 Pool 에서 Connection 객체를 꺼내서 사용하고 사용이 끝나면 다시 Pool에 반납한다.
다들 여기까지는 보통 알고 있을 것이다.
사실 나는 커넥션풀의 장점이 무엇이냐고 자문자답 해보면,
"큰 성능 저하를 일으킨다, 반복되는 비용과 시간이 든다, OOM이 발생할 우려가 높다." 이정도로 생각했다.
여기에 추가로 스스로에게 꼬리를 물어, 그럼 "큰 성능 저하, 반복되는 비용이 구체적으로 어떤 것인가?" 라고 자문자답을 해보면 답이 나오질 았다. 그래서 공부한 결과를 기록으로 남겨본다.
Database는 최초 접속시 TCP 통신을 한다. TCP 통신을 하기 때문에,
데이터를 전송하기 전에 정확한 전송을 보장하기 위한 3 Way-handshake 작업이 발생한다.
그리고 데이터 전송이 종료되면 리소스를 정리하기 위한 작업인 4 Way-handshake가 발생한다.
사진 출처 : Mind Net
TCP는 신뢰성을 보장하는 통신 방법이고, 신뢰성 보장을 위해 데이터 전달과 흐름 제어, 혼잡 제어 등을 제공하는 전송 계층이다. 또한 가상 회선 방식이다.
우리가 반대편에 있는 미국 사이트에 DB연결 요청을 한다고 하자. 한국과 미국의 거리는 상당하다.
TCP 통신에 근거한 가상 회선 방식으로 DB연결을 요청한다고 하면 그동안 3/4 Way-handshake 작업이 일어날 것이다.
미국까지의 거리를 고려했을때, 가상 회선 방식인 TCP 통신의 비용은 위에서 이야기한 것처럼 많은 비용이 들것이다.
즉 이러한 반복적인 작업으로 인해 발생하는 성능 저하(비용)을 방지하기 위해 사용하는 것이 바로 Connection pool 이다.
공부를 깊게 하다보면 항상 CS와 마주치게 된다. CS의 기본이 튼실해야함을 요즘 자주 느낀다. 열심히 공부 해야지..
'DataBase' 카테고리의 다른 글
[DB] Redis(Remote dictionary server)란? (0) | 2021.06.16 |
---|---|
[Real MySQL 정리] 5장 인덱스 (0) | 2021.04.25 |
[Real MySQL 정리], 4장 트랜잭션과 잠금 (0) | 2021.04.25 |
[Real MySQL 정리], 3장 MySQL 아키텍처 (0) | 2021.04.25 |
MySQL 날짜 포맷 변경 (0) | 2020.09.12 |