2022. 8. 12. 21:16ㆍCS/데이터베이스
※ DB Connection
- DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단
- DB Connection은 Database Driver와 DB 연결 정보를 담은 URL이 필요하다.
- Java의 DB Connection은 JDBC를 주로 이용하는데, URL 타입을 사용한다.
- 만약 예를 들어, 웹 어플리케이션 서버를 가정했을 때 서버는 클라이언트의 요청을 받은 후 DB에서 데이터를 조작해야 하는 요청이라면 DB로 쿼리문을 날리는데, 이 때 DB서버에 접근하기 위해 DB Connection 객체가 필요하다.
※ DB Connection 구조
- 2Tier - 클라이언트로써 자바 프로그램(JSP)이 직접 DB 서버로 접근하여 데이터에 액세스하는 구조
- 3Tier - 자바 프로그램과 DB서버 중간에 미들웨어 층을 두어 그 미들웨어 층에게 비즈니스 로직 구현부터 트랜잭션 처리, 리소스 관리 등을 전부 맡기는 구조
※ JDBC
- Java Database Connectivity의 약어로 자바 언어로 다양한 종류의 DBMS에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API이다.
- 원래라면, DB마다 연결 방식과 통신 규격이 제각각이기 때문에 프로그램과 연결된 DB가 변경될 시 많은 변경 사항이 존재할 수밖에 없다는 문제가 존재한다.
- 하지만, 각 DBMS에 맞는 JDBC를 받아주면 쉽게 DBMS를 변경할 수 있다.
- DBMS 종류(MySQL, MS-SQL, Oracle 등)에 관계 없이 하나의 JDBC API를 사용하여 DB 작업을 처리할 수 있게 된다.
※ JDBC 드라이버
- 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 Client Side Adapter이다.
- 각각의 DBMS는 자신에게 알맞는 JDBC 드라이버를 제공하고 있다.
※ JDBC 실행과정
▷ getConnection()
- DriverManager.getConnection() 은 실제 자바 프로그램과 DB를 네트워크 상에서 연결해주는 메소드이다.
- 연결에 성공하면 DB와의 연결 상태를 Connection 객체로 표현하여 반환한다.
- 가장 부하가 많이 걸리는 과정이다.
▷ Connection 객체
- DB 연결 객체
- 데이터베이스로의 연결 기능을 제공하며, Statement 객체를 생성하는 기능 제공
- SQL문을 데이터베이스에 전송하거나, 이러한 SQL문을 커밋하거나 롤백하는데 사용
- 보통 Connection 하나 당 트랜잭션 하나를 관리한다.
- Mybatis의 SqlSession, Hibernate의 TransactionManager 등의 Close가 이루어지면 Connection을 ConnectionPool에 반납함.
▷ Statement 또는 PreparedStatement
- SQL문 실행 객체
▷ ResultSet
- 쿼리문의 결과를 가지는 객체
▷ Driver
- 각 JDBC Driver 벤더에서 구현해야 하는 인터페이스
▷ DriverManager
- 사용될 드라이버를 등록하거나 등록을 해제하는 기능과 DB와 연결하는 기능을 수행함
※ 커넥션 풀(DBCP)의 개념
- WAS가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 왔을 때 만들어뒀던 Connection 객체를 빌려주고 해당 객체의 임무가 끝나면 다시 Connection 객체를 반납받아 pool에 놓는 프로그래밍 기법이다.
- 커넥션 풀을 사용하면 커넥션 수를 제한할 수 있기 때문에 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있고, DB 접속 모듈을 공통화하여 DB 서버의 환경이 바뀔 경우 유지보수가 쉬워진다.
- 이러한 방식은 매 연결마다 소켓을 생성하여 3-way handshaking 과정을 거치는 것이 아니라 이미 형성된 Connection을 재사용하기 때문에 네트워크 병목이라는 문제점을 어느 정도 해소할 수 있다.
※ 커넥션 풀(DBCP)의 동작 원리
- Hikari CP는 가벼운 용량과 빠른 속도를 가지는 JDBC의 커넥션 풀 프레임워크이다. Spring Boot를 사용한다면 대부분 이 Hikari를 사용하게 되는데, 스프링부트 2.0부터 default JDBC connection pool이기 때문이다.
▷ Hikari CP가 동작하는 방식
- Thread가 Connection을 요청하면 Connection pool의 방식에 따라 유휴 Connection을 찾아서 반환한다. Hikari CP의 경우 이전에 사용했던 Connection이 존재하는지를 확인하고, 이를 우선적으로 반환하는 특징이 있다.
- 만약 사용자가 많아서 가능한 Connection이 존재하지 않을 수도 있다. 이 때는 HandOffQueue를 Polling 하면서 다른 Thread가 Connection을 반납하기를 기다린다.
폴링(polling) : 리얼타임 웹을 위한 기법으로, 일정 주기를 가지고 서버와 응답을 주고 받는 방식을 말한다.
이 주기적인 응답 교환이 필요한 이유는 persistent connection이 불가능하기 때문이다. (tcp 방식)
- 다른 Thread가 커넥션 풀에 커넥션을 반납하였다면, 커넥션 풀은 HandOffQueue에 반납된 커넥션을 삽입하고 HandOffQueue를 Polling 하던 Thread는 Connection을 획득하게 된다.
※ 커넥션 풀(DBCP)의 크기와 성능
- 커넥션 풀이 클수록 좋을까? 커넥션을 많이 가지고 있다면 유리하다고 느낄 수 있지만 실상은 그렇지 않다.
- Connection의 주체는 Thread이기 때문에 Thread와 함께 고려해주어야 한다.
Thread Pool 크기 < Connection Pool 크기
→ Thread Pool에서 트랜잭션을 처리하는 Thread가 사용하는 Connection 이외에 남는 Connection은 메모리 공간만 차지하고 있게 된다.
Thread Pool 크기와 Connection Pool 크기 모두 증가
→ Thread 증가로 인해 더 많은 Context Switching이 발생한다.
→ Disk 경합 측면에서 성능 한계가 발생한다.
→ 데이터베이스는 하드디스크 하나 당 하나의 I/O를 처리하므로 블로킹이 발생하고, Disk의 병목으로 인해 특정 시점부터 성능 향상이 미비해진다.
- 따라서, DB의 입장에서 Connection은 Thread와 어느 정도 일치한다고 볼 수 있다. Connection이 많다는 것은 DB 서버가 Thread를 많이 사용한다는 것을 의미하고, 이에 따라 Context Switching으로 인한 오버헤드가 더 많이 발생하기 때문에 Connection Pool을 아무리 늘려도 성능적인 한계가 존재한다.
- MySQL의 공식레퍼런스에서는 600여 명의 유저를 대응하는데 15~20개의 커넥션 풀만으로도 충분하다고 언급하고 있다. MySQL은 최대 연결 수를 무제한으로 설정한 뒤 부하 테스트를 진행하면서 최적화된 값을 찾는 것을 추천한다.
- 우아한 형제들 테크 블로그에서는 다음과 같은 공식을 추천하고 있다.
- Tn : 전체 Thread의 개수
- Cm : 하나의 Task에서 동시에 필요한 Connection 수
[출처]
DB 커넥션 풀(Connection pool)이란? HikariCP란? (tistory.com)
DB 커넥션 풀(Connection pool)이란? HikariCP란?
커넥션 비용 WAS(Web Application Server)와 데이터베이스 사이의 연결에는 많은 비용이 든다. MySQL 8.0을 기준으로 INSERT 문을 수행할 때 필요한 비용의 비율은 다음과 같다. 괄호 안의 숫자가 비율을 의
code-lab1.tistory.com
https://techblog.woowahan.com/2663/
HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그
{{item.name}} 1부 HikariCP Dead lock에서 벗어나기 (이론편)은 잘 보셨나요? 2부 HikariCP Dead lock에서 벗어나기 (실전편)에서는 실제 장애 사례를 기반으로 장애 원인을 설명하고 해결 사례를 공유하고자
techblog.woowahan.com
'CS > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 인덱스(Index) (0) | 2022.08.13 |
---|---|
[데이터베이스] 데이터베이스 키(key)의 개념 및 종류 (0) | 2022.08.12 |
[데이터베이스] 데이터베이스 vs 파일시스템 (0) | 2022.08.12 |
[데이터베이스] 데이터베이스의 저장과 접근 : 해싱 (0) | 2022.06.20 |
[데이터베이스] 트랜잭션 (0) | 2022.06.19 |