컨넥션풀링이란?
컨넥션 풀링은 데이터베이스와의 연결(Connection)을 효율적으로 관리하기 위한 기술로, 애플리케이션에서 필요할 때마다 새 연결을 생성하고 닫는 대신, 재사용 가능한 연결을 미리 생성하고 이를 풀(pool)에 보관하여 요청 시 제공하는 방식입니다. 이 방식은 데이터베이스와 연결하는 비용을 줄이고, 애플리케이션의 성능을 크게 향상시킵니다.
1. 데이터베이스 연결의 일반적인 문제점
- 비용이 높은 연결 생성: 데이터베이스 연결을 생성하는 데는 TCP 핸드셰이크, 인증 등 시간이 많이 걸립니다.
- 연결의 반복적인 생성과 종료: 자주 연결을 생성하고 종료하면 시스템 리소스를 낭비하게 됩니다.
- 동시 요청 증가: 많은 사용자가 동시에 애플리케이션에 접근하면, 새 연결을 생성하는 데 소요되는 시간이 병목 현상을 유발할 수 있습니다.
2. 컨넥션 풀링의 작동 원리
- 초기화 시 연결 풀 생성:
- 애플리케이션 시작 시 일정 개수의 DB 연결(예: 10개)을 생성해 풀에 보관합니다.
- 클라이언트 요청 처리:
- 사용자가 데이터베이스 작업을 요청하면, 연결 풀에서 사용 가능한 연결을 할당합니다.
- 작업 완료 후 연결 반환:
- 클라이언트 작업이 완료되면, 연결은 닫히지 않고 풀로 반환되어 재사용됩니다.
- 동적 확장/축소:
- 연결 풀이 꽉 차면 새로운 연결을 추가 생성하거나, 유휴 연결이 많으면 일부를 제거합니다.
3. 장점
- 성능 향상:
- 새 연결을 생성하지 않고 기존 연결을 재사용하므로, 연결 생성/종료 오버헤드를 줄일 수 있습니다.
- 동시성 관리:
- 동시 요청이 많아도 미리 생성된 연결을 재활용하여 처리 속도를 유지할 수 있습니다.
- 리소스 관리:
- 연결 풀이 최대 연결 수를 제한하므로, 데이터베이스에 과도한 연결 요청을 방지할 수 있습니다.
- 확장성:
- 애플리케이션의 사용자 수가 증가해도 풀을 확장하여 처리량을 유지할 수 있습니다.
4. 단점
- 초기 설정 비용:
- 초기화 시 연결 풀을 생성하는 데 시간이 걸릴 수 있습니다.
- 유휴 연결의 자원 낭비:
- 사용되지 않는 연결이 풀에 오래 유지되면 리소스가 낭비될 수 있습니다.
- 복잡한 관리:
- 풀 크기, 연결 유지 시간, 연결 타임아웃 등을 신중히 설정해야 합니다.
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
username="hr" password="hr" maxTotal="20" maxIdle="10"
maxWaitMillis="-1"/>
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBUtil {
public static Connection getConnection() {
Context initContext;
Connection conn = null;
try {
initContext = new InitialContext();
Context envContext;
envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
conn = ds.getConnection();
}
catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
'Front-End > WEB' 카테고리의 다른 글
| 서블릿 Filter 설명 (0) | 2024.11.20 |
|---|---|
| Binding / Redirect (0) | 2024.11.19 |
| Response.SendRedirect (0) | 2024.11.18 |
| Web-Servlet (0) | 2024.11.14 |
| 동기/비동기 (0) | 2024.11.13 |