Database Pool

주윤·2023년 10월 24일

Database-Pool

목록 보기
1/1

📖 Connection Pool

📕 Connection Pool의 개념

웹 컨테이너(WAS)가 실행되면서 일정량의 Connection 객체를 미리 만들어서 pool에 저장했다가, 클라이언트 요청이 오면 Connection 객체를 빌려주고 해당 객체의 임무가 완료되면 다시 Connection 객체를 반납 받아서 pool에 저장하는 프로그래밍 기법이다.

Container 구동 시 일정 수의 Connection 객체를 생성하게 되며 클라이언트의 요청에 의해 애플리케이션이 DBMS 작업을 수행해야 하면, Connection Pool에서 Connection 객체를 받아와 작업을 진행한다. 이후 작업이 끝나면 Connetion Pool에 Connection 객체를 반납한다.

📕 Connection Pool(DBCP)의 동작 원리

📌 Hikari CP가 동작하는 방식

데이터베이스 연결(Connection)을 관리해 주는 도구(라이브러리)

Thread가 Connection을 요청하면 Connection Pool의 각자의 방식에 따라 유휴 Connection을 찾아서 반환한다. Hikari CP의 경우, 이전에 사용했던 Connection이 존재하는지 확인하고, 이를 우선적으로 반환하는 특징이 있다.

가능한 Connection이 존재하지 않으면, HandOffQueue를 Polling하면서 다른 Thread가 Connection을 반납하기를 기다린다. (지정한 TimeOut 시간까지 대기하다가 시간이 만료되면 예외를 던진다.)

최종적으로 사용한 Connection을 반납하면 Connection Pool이 Connection 사용 내역을 기록하고, HandOffQueue에 반납된 Connection을 삽입한다.
이를 통해 HandOffQueue를 Polling하던 Thread는 Connection을 획득하고 작업을 이어나간다.

📕 Connection Pool(DBCP)의 장점

  • DB 접속 설정 객체를 미리 만들어 연결하여 메모리 상에 등록해 놓기 때문에 불필요한 작업(커넥션 생성, 삭제)이 사라지므로 클라이언트가 빠르게 DB에 접속이 가능하다.
  • DB Connection 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈 방지가 가능하다.
  • DB 접속 모듈을 공통화하여 DB 서버의 환경이 바뀔 경우 쉬운 유지 보수가 가능하다.
  • 연결이 끝난 Connection을 재사용함으로써 새로 객체를 만드는 비용을 줄일 수 있다.

📕 참고할 점

📌 동시 접속자가 많을 경우

너무 많은 DB 접근이 발생할 경우에는 커넥션은 한정되어 있기 때문에 쓸 수 있는 커넥션이 반납될 때까지 기다려야 한다. 너무 많은 커넥션을 생성할 시에는 커넥션 또한 객체이므로 많은 메모리를 차지하게 되고, 프로그램의 성능을 떨어뜨리는 원인이 된다.

📌Connection Pool이 커지면 성능은 무조건 좋아질까?

그렇지 않다. Connection의 주체는 Thread이므로 Thread와 함께 고려해야 한다.

Thread Pool 크기 < Connection Pool 크기

Thread Pool에서 트랜잭션을 처리하는 Thread가 사용하는 Connection 외에 남는 Connection은 실질적으로 메모리 공간만 차지하게 된다.

Thread Pool 크기와 Connection Pool 모두 크기 증가

Thread 증가로 인해 더 많은 Context Switching이 발생한다.

Disk 경합 측면에서 성능 한계가 발생한다.

데이터베이스는 하드 디스크 하나 당 하나의 I/O를 처리하므로 블로킹이 발생한다.
즉, 특정 시점부터는 성능적인 증가가 Disk 병목으로 인해 미비해진다.

Connection이 많다는 의미는 데이터베이스 서버가 Thread를 많이 사용한다는 것을 의미하고, 이에 따라 Context Switching으로 인한 오버헤드가 더 많이 발생하기 때문에 Connection Pool을 아무리 늘리더라도 성능적인 한계가 존재한다.

📍 병목 현상

시스템의 CPU나 메모리, 디스크 등의 자원 중 하나가 다른 자원들에 비해 처리 속도가 느려		서, 전체적인 성능을 제한하는 경우

📕 DB Connection

DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단

Database Driver와 Database 연결 정보를 담은 URL이 필요함

📌 구조

2Tier

클라이언트로서의 자바 프로그램(JSP)이 직접 데이터베이스 서버로 접근하여 데이터를 액세스하는 구조

3Tier

자바 프로그램과 데이터베이스 서버 중간에 미들웨어 층을 두어, 그 미들웨어 층에게 비즈니스 로직 구현부터 트랜잭션 처리, 리소스 관리 등을 전부 맡기는 구조

📕 JDBC - Jaba Database Connectivity

Java 언어로 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQl 인터페이스 API

DBMS 종류에 상관 없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리할 수 있게 된다.

📌 JDBC 실행과정

  1. 드라이버 로드
  2. DB 서버의 IP, ID, PW 등을 DriverManager 클래스의 getConnection() 메소드를 사용하여 Connection 객체 생성
  3. Connection에서 PreparedStatement 객체를 받음
  4. executeQuery를 수행하고 ResultSet 객체를 받아 데이터를 처리
  5. 사용하였던 ResultSet, PreparedStatement, Connection을 close

getConnection()

자바 프로그램과 데이터베이스를 네트워크 상에서 연결해 주는 메소드
연결에 성공하면 DB와의 연결 상태를 Connection 객체로 표현하여 반환한다.
=> 가장 부하가 많이 걸리는 과정

Connection

DB 연결 객체

데이터베이스로의 연결 기능을 제공하며, Statement 객체를 생성하는 기능 제공

SQL문을 데이터베이스에 전송하거나, 이러한 SQL문을 커밋하거나 롤백하는데 사용
보통 Connection 하나 당 트랜잭션 하나를 관리한다.

Close가 이루어지면 Connection을 ConnectionPool에 반납함.

Statement

SQL문 실행 객체

ResultSet

쿼리문의 결과를 가지는 객체

Driver

각 JDBC Driver에서 구현해야 하는 인터페이스

DriverManager

사용될 드라이버를 등록하거나 등록을 해제하는 기능과 DB와 연결하는 기능을 수행함

0개의 댓글