728x90
목차
- 1. WAS(Web Application Server)와 DB(Database; 데이터베이스)의 관계
- 2. Database Connection Pool (DB 커넥션 풀)이 필요한 이유
- 3. DB 커넥션 풀 설정 값과 설명
- 4. WAS의 Thread 수와 커넥션 풀(Connection Pool) 수의 관계
- 5. DB Connection Pool (DB 커넥션 풀) 관리
- 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
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(1, String.valueOf(year));
logPs.setString(2, "test");
logPs.setObject(3, jsonbObject);
logPs.executeUpdate();
logPs.close();
conn.close();
}
|
cs |
'개발자 랩실 > 스프링&스프링부트' 카테고리의 다른 글
[Java] ThreadLocal (0) | 2022.03.04 |
---|---|
[Java] 싱글톤 패턴 (0) | 2022.02.26 |
[Java] :: 더블 콜론 사용 이유 (0) | 2022.02.08 |
Spring Framework(스프링 프레임워크)란 (0) | 2022.01.31 |
댓글