상세 컨텐츠

본문 제목

[Java] DB Connection Pool (DB 커넥션 풀 / DBCP)

IT/Spring 및 Boot

by SINAFLA 2021. 6. 17. 06:00

본문

반응형

목차

  1. 1. WAS(Web Application Server)와 DB(Database; 데이터베이스)의 관계
  2. 2. Database Connection Pool (DB 커넥션 풀)이 필요한 이유
  3. 3. DB 커넥션 풀 설정 값과 설명
  4. 4. WAS의 Thread 수와 커넥션 풀(Connection Pool) 수의 관계
  5. 5. DB Connection Pool (DB 커넥션 풀) 관리
  6. 6. Java를 이용한 DB Connection Pool 선언
 

1. WAS(Web Application Server)와 DB(Database; 데이터베이스)의 관계

 
 
 

2. Database Connection Pool (DB 커넥션 풀)이 필요한 이유

 

 
WAS는 HTTP 요청에 따라 Thread를 생성하게 되고, 대부분의 비지니스 로직은 DB 서버에서 데이터를 얻게 된다. 모든 요청에 DB 접속을 위한 Driver를 로드하고 Connection 객체를 생성하여 연결한다면 물리적으로 DB 서버에 지속적으로 접근해야 한다. 그러면 리소스를 close하여 반환하는 데 비용이 발생된다.
 
이러한 상황에서 DB 커넥션 객체를 생성하는 부분에 대한 비용과 대기 시간을 줄이고, 네트워크 연결에 대한 부담을 줄일 수 있다. 그래서 Database Connection Pool (DBCP / DB 커넥션) 풀이 문제를 해결한다.
 
 

3. DB 커넥션 풀 설정 값과 설명

커넥션 풀 설정 값
설명
initialSize
커넥션 풀 생성 시 최초 생성한 Connection 객체의 수 (기본값 0)
minIdle
최소한으로 유지될 Connection 객체의 수 (기본값 0)
maxIdle
반납된 유휴 Connection 객체를 유지할 수 있는 최대 값 (기본값 8)
maxActive
동시에 사용할 수 있는 최대 커넥션 갯 수 (기본값 8)
maxWait
할당받을 Connection 객체가 없을 때 스레드를 블록시킬 시간 (1/1000초 단위)
  • maxActive >= initialSize
    • 최대 커넥션 수는 초기에 생성할 커넥션 개수와 같거나 크게 설정해야 한다.
  • maxActive = maxIdle
    • maxActive 값과 maxIdle 값은 같아야 바람직하다.
    • maxIdle의 값이 maxActive의 값보다 작을 경우 추가 커넥션을 데이터베이스에 연결하고 사용한 뒤 풀에 반납할 경우에 maxIdle 값의 영향을 받아 실제로 닫아버린다. 그래서 일부 커넥션을 매번 생성하고 닫는 비용이 발생할 수 있다.
 

4. WAS의 Thread 수와 커넥션 풀(Connection Pool) 수의 관계

  • 둘은 직접적으로 메모리와 관련이 있기 때문에 많이 사용하면 할 수록 메모리를 많이 점유하게 된다. WAS의 스레드 수보다 DB 커넥션 풀의 수보다 적게 설정되어 있으면 서버에서는 많은 요청을 처리하지 못하고 대기할 수 밖에 없다.

5. DB Connection Pool (DB 커넥션 풀) 관리

  • WAS의 스레드는 DB 커넥션 풀에 설정되어 있는 값보다 조금 더 여유롭게 지정하는 것이 바람직하다. 최적의 성능 구현은 실제 요청이 얼마나 들어오는지 파악하는게 중요하므로 성능 테스트를 통해 최적화된 값을 구하는 거다.

6. Java를 이용한 DB Connection Pool 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    static Connection conn = null;
    public static class dbPool{
        static final BasicDataSource dbcp = new BasicDataSource();
        
        static {
            try {
                dbcp.setDriverClassName("org.postgresql.Driver");
                dbcp.setUrl(DB_URL);
                dbcp.setUsername(DB_USER);
                dbcp.setPassword(DB_PASSWD);
                dbcp.setInitialSize(10);
                dbcp.setMaxIdle(10);
                dbcp.setMaxActive(30);
                dbcp.setValidationQuery("SELECT 1");
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public static Connection getDBCP2Connection() throws SQLException {
            return dbcp.getConnection();
        }
    }
    public static void main(String[] args) {
        conn = dbPool.getDBCP2Connection();
                
        StringBuffer logSql = new StringBuffer();
        logSql.append("INSERT INTO TEST");
        logSql.append("(YEAR,MSG_ID,VALUE_CODE,MSG,REG_DTE)");
        logSql.append("VALUES");
        logSql.append("(?,nextval('seq_test'),?,?,CURRENT_TIMESTAMP)");
           
        PreparedStatement logPs = conn.prepareStatement(logSql.toString());
        logPs.setString(1String.valueOf(year));
        logPs.setString(2"test");
        logPs.setObject(3, jsonbObject);
            
        logPs.executeUpdate();
        logPs.close();
        conn.close();
    }
 
cs
반응형

관련글 더보기

댓글 영역