DBCP (Database Connection Pool) 이란?
Connection Pool
에 대해 공부를 하다가 Connection Pool
을 사용함으로써 얻을 수 있는 이점(비용)이 무엇인지 궁금해서 알아보았다.
Connection Pool
이란?
Connection Pool
가 무엇인지 아주 쉽게 기억하는 방법은 단어 그대로 해석하는 것이다.
즉, Connection들의 pool(웅덩이)라는 것이다.
먼저 Connection Pool
을 사용하지 않는 웹 애플리케이션의 처리과정을 살펴보자.
- 웹 애플리케이션은 클라이언트의 HTTP 요청이 들어오면 쓰레드를 생성한다.
- 대부분의 비지니스 로직에서는 DB서버로부터 데이터를 얻어서 그 요청을 처리하게 된다.
- DB서버로부터 데이터를 얻기 위해서는 물리적으로 DB서버에 지속적으로 접근하는 작업이 필요하다.
String driverPath = "net.skhu.kh.jdbc.Driver";
String address = "jdbc:jtds:sqlserver:17171771";
String userName = "17171771";
String password = "test123";
String query = "SELECT ... where id = ?";
try {
Class.forName(driverPath);
Connection con = DriverManager.getConnection(address, userName, password); // [1]
PreparedStatement ps = con.prepareStatement(query);
ps.setString(1, id);
ResultSet rs = get.executeQuery();
// ....
} catch (Exception e) { }
} finally {
rs.close();
ps.close();
}
위 코드처럼 DB 서버 접속을 위한 과정을 HTTP요청(DB를 사용하는)이 있을때 마다 반복해서 작업해야 한다는 뜻이다.
이렇게 물리적으로 DB서버에 최초로 연결하여 Connection 객체를 생성는 작업은 비용적인 측면에서 큰 성능 저하를 야기한다. (Out of memory의 주된 원인이 되기도 한다.)
이와 같은 문제를 사전에 방지하기 위해 사용하는것이 바로 Connection Pool
이다.
Connection Pool
은 WAS 실행시 일정량의 Connection 객체를 미리 생성하여 Pool 이라는 공간(캐시)에 저장해둔다. 그리고 DB연결 요청이 있을때 마다 Pool 에서 Connection 객체를 꺼내서 사용하고 사용이 끝나면 다시 Pool에 반납한다.
그렇다면, 여기서 말하는 비용적인 측면 이란 무엇을 의미할까?
위에서 물리적으로 DB서버에 최초로 연결하여 Connection 객체를 생성는 작업은 비용적인측면에서 큰 성능 저하를 야기한다고 설명했다.
개발 공부를 하다보면 어디선가 TCP/IP라는 것을 본 적이 있을것이다. 대부분의 자바 기본서 뒷 부분에 등장하며 TCP
는 비교대상으로 UDP
가 함께 소개된다.
이 둘에 대하여 간략하게 설명하자면 TCP
는연결형 서비스로 데이터 전송에 대한 성공을 보장하고, UDP
는 비연결형 서비스로 데이터 전송에 대한 성공을 보장하지 않는다. 즉, 데이터를 주고받는 신호 정보를 확인하지 않는 UDP
가 TCP
에 비해 성능이 좋다.
그렇다면, 뜬금없이 TCP
에 대한 이야기는 왜 꺼냈을까?
바로 Database는 최초 접속시 TCP 통신을 하기 때문이다.
TCP 로 통신을 하는 프로그램들은 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위한 작업을 처리하는데, 이 작업을 바로 Three Way Handshake라고 한다.
또한 데이터 전송이 종료되면 사용한 리소스를 정리하기 위한 작업인 Four Way Handshake도 발생한다.
즉 이러한 반복적인 작업으로 인해 발생하는 성능 저하(비용)을 방지하기 위해 사용하는 것이 바로 Connection pool
이다.
Connection Pool에는 얼마만큼의 Connection을 미리 생성해 두어야 할까?
-
Connection pool에 무조건 많은 Connection들을 생성하게 되면, Connection 자체도 객체이기 때문에 그만큼 메모리를 추가로 사용하게 된다. (성능 저하)
-
반대로 Connetion pool에 Connection 객체가 너무 적으면 많은 유저들이 사용하는 애플리케이션의 경우 사용중인 Connection이 반납될때까지 대기해야하는 시간이 길어지게 된다. (성능 저하)
결론적으로 WAS의 Thread 수 > Connection의 수 가 되도록 설계하는것이 성능상 올바른 설계인데, 그 이유는 아주 간단한다. HTTP 요청에대한 모든 Thread가 DB에 접근하는 것이 아니기 때문이다.
즉 성능테스트를 통해 최적의 Connection
의 개수를 찾는것이 중요하다.
Reference
'Java' 카테고리의 다른 글
Java Reflection API에 대하여 (JPA에서 기본 생성자가 반드시 필요한 이유) (2) | 2021.01.10 |
---|---|
싱글턴 패턴의 다양한 구현 방법을 알아보자. (0) | 2020.12.21 |
Arrays.ParallelSort() 와 Arrays.Sort()의 차이점은 무엇일까? (0) | 2020.11.24 |
불변 객체(Immutable Object)에 대하여 (0) | 2020.11.22 |
Serializable 인터페이스에 대하여 (0) | 2020.11.14 |