Tomcat Connection Pool
2024. 11. 19. 10:41

컨넥션풀링이란?

컨넥션 풀링은 데이터베이스와의 연결(Connection)을 효율적으로 관리하기 위한 기술로, 애플리케이션에서 필요할 때마다 새 연결을 생성하고 닫는 대신, 재사용 가능한 연결을 미리 생성하고 이를 풀(pool)에 보관하여 요청 시 제공하는 방식입니다. 이 방식은 데이터베이스와 연결하는 비용을 줄이고, 애플리케이션의 성능을 크게 향상시킵니다.

1. 데이터베이스 연결의 일반적인 문제점

  • 비용이 높은 연결 생성: 데이터베이스 연결을 생성하는 데는 TCP 핸드셰이크, 인증 등 시간이 많이 걸립니다.
  • 연결의 반복적인 생성과 종료: 자주 연결을 생성하고 종료하면 시스템 리소스를 낭비하게 됩니다.
  • 동시 요청 증가: 많은 사용자가 동시에 애플리케이션에 접근하면, 새 연결을 생성하는 데 소요되는 시간이 병목 현상을 유발할 수 있습니다.

2. 컨넥션 풀링의 작동 원리

  1. 초기화 시 연결 풀 생성:
    • 애플리케이션 시작 시 일정 개수의 DB 연결(예: 10개)을 생성해 풀에 보관합니다.
  2. 클라이언트 요청 처리:
    • 사용자가 데이터베이스 작업을 요청하면, 연결 풀에서 사용 가능한 연결을 할당합니다.
  3. 작업 완료 후 연결 반환:
    • 클라이언트 작업이 완료되면, 연결은 닫히지 않고 풀로 반환되어 재사용됩니다.
  4. 동적 확장/축소:
    • 연결 풀이 꽉 차면 새로운 연결을 추가 생성하거나, 유휴 연결이 많으면 일부를 제거합니다.

3. 장점

  1. 성능 향상:
    • 새 연결을 생성하지 않고 기존 연결을 재사용하므로, 연결 생성/종료 오버헤드를 줄일 수 있습니다.
  2. 동시성 관리:
    • 동시 요청이 많아도 미리 생성된 연결을 재활용하여 처리 속도를 유지할 수 있습니다.
  3. 리소스 관리:
    • 연결 풀이 최대 연결 수를 제한하므로, 데이터베이스에 과도한 연결 요청을 방지할 수 있습니다.
  4. 확장성:
    • 애플리케이션의 사용자 수가 증가해도 풀을 확장하여 처리량을 유지할 수 있습니다.

4. 단점

  1. 초기 설정 비용:
    • 초기화 시 연결 풀을 생성하는 데 시간이 걸릴 수 있습니다.
  2. 유휴 연결의 자원 낭비:
    • 사용되지 않는 연결이 풀에 오래 유지되면 리소스가 낭비될 수 있습니다.
  3. 복잡한 관리:
    • 풀 크기, 연결 유지 시간, 연결 타임아웃 등을 신중히 설정해야 합니다.

 

<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