[DB] Commons DBCP2

Common DBCP2

Apache에서 제공하는 Database Connection Pool을 제공하기위한 오픈소스 라이브러리이다
Database를 사용하기위해 커넥션을 생성하는 부담을 줄여준다
Connection Pool을 사용하지 않았을때는 다음과 같이 동작한다

  1. DB접속을 위해 JDBC 드라이버를 로드한다
  2. DB Configuration 정보를 기반으로 DriverManager.getConnection()을 통해 Connection을 받는다
  3. Connection으로부터 쿼리 수행을 위한 PreparedStatement를 받는다
  4. executeQuery를 통해 쿼리를 수행하고 ResultSet 결과를 받는다
  5. 받은 데이터를 처리하게 되면 close를 통해 리소스를 반환한다

Connection Pool을 사용할때는 다음과 같이 동작한다

  1. WAS가 실행되면서 Pool에 DB Connection과 TimeStamp를 한 Pair로 하는 ObjectTimeStampPair를 생성한다
  2. 요청에 따라 커넥션이 필요할 때 Pool에서 Connection을 LIFO형태로 받아 쓰고 반납한다


Properties

커넥션 개수 관련 속성

  • initialSize : DataSource 생성 후 최초로 getConnection() 메스드를 호출 시 커넥션 풀에 넣을 커넥션 수
  • MaxTotal : 동시에 사용가능한 수 있는 최대 커넥션 수
  • MaxIdle : Connection Pool에 반납할 때 최대로 유지될 수 있는 커넥션 수
  • MinIdle : 최소한으로 유지할 커넥션 수
  • MaxWaitMillis : Pool이 고갈되었을 때 최대 대기시간 (ms단위, default = -1 = unlimit)
    • 적절하지 않은 시간으로 설정시 Tomcat Thread Pool이 죽거나 오류메세지가 자주 출력된다
      커넥션 개수와 관련된 속성은 다음과 같은 조건을 만족해야 한다
  • MaxTotal >= initialSize
  • MaxIdle >= MinIdle
  • MaxActive = MaxIdle

마지막 조건의 경우 맞지 않으면 커넥션이 존재하는데도 불구하고 DB에 가서 커넥션을 생성해와 사용한 뒤 풀에 반납하여 제거하게 되니 불필요한 비용이 생긴다

유효성 검사 관련 속성

  • testOnBorrow : 커넥션 풀에서 커넥션을 얻을 때 테스트 실행 (default = true)
  • trestOnReturn : 커넥션 풀로 커넥션을 반환할 때 테스트 실행 (default = false)
  • trestWhileIdle : Evictor 스레드가 실행될 때 커넥션 풀 안에 있는 유휴 상태의 커넥션을 대상으로 테스트 실행 (deafult = false, MySQL : SELECT 1)

Evictor 스레드 관련 속성

Evictor 스레드는 Commons DBCP 내부에서 별도로 수행되는 커넥션 자원 정리 스레드다

  • timeBetweenEvictionRunMillis : Evictor 스레드가 동작하는 간격 (default = -1 = false)
  • numTestsPerEvictionRun : Evictor 스레드 동작시 한번에 검사할 커넥션 수
  • minEvictableIdleTimeMillis : Evictor 스레드 동시 커넥션 TimeStamp값 확인해 설정 값 이상일 경우 제거 (default = 30min)

Statement Pooling 관련 옵션

Statment를 pooling할 수 있도록 한다
pool을 사용하는 메모리는 statement 객체 크기 * pool 수 * connection 수가 된다

  • poolPreparedStatements : Statement pool로도 Commons DBCP를 사용할 수 있게 한다
  • maxOpenPreparedStatements : 최대로 열어둘 prepared statements 수 (deafult = unlimit)


JAVA Config

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
@Bean
public DataSource dataSource() {
BasicDataSource source = new BasicDataSource();
//basic configurations
source.setDriverClassName("${datasource.driverClass}");
source.setUrl("${datasource.url}");
source.setUsername("${datasource.username}");
source.setPassword("${datasource.password}");
//num of connections
source.setInitialSize("${datasource.initialSize}");
source.setMaxTotal("${datasource.maxTotal}");
source.setMaxIdle("${datasource.maxIdle}");
source.setMinIdle("${datasource.minIdle}");
//pool waiting time
source.setMaxWaitMillis("${datasource.maxWaitMillis}");
//validation
source.setTestOnBorrow("${datasource.testOnBorrow}");
source.setTestWhileIdle("${datasource.testWhileIdle}");
source.setValidationQuery("${datasource.validationQuery}");
//Evictor
source.setMinEvictableIdleTimeMillis("${datasource.minEvictableIdleTimeMillis}");
source.setTimeBetweenEvictionRunsMillis("${datasource.timeBetweenEvictionRunsMillis}");
source.setNumTestsPerEvictionRun("${datasource.numTestsPerEvictionRun}");
//statement pool
source.setPoolPreparedStatements("${datasource.poolPreparedStatements}");
source.setMaxOpenPreparedStatements("${datasource.maxOpenPreparedStatements}");

return source;
}



참조

https://d2.naver.com/helloworld/5102792

Author: Song Hayoung
Link: https://songhayoung.github.io/2020/06/30/Database/Commons_DBCP2/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.