[Etc] DB Connection Pool & JNDI
# Connection Pool
- DB접속시 필요한 커넥션 객체 다수를 풀이라는 공간에 미리 저장해두어 요청이 있는 경우
- 커넥션 제공, 종료시 풀에 반납하는 방식으로 시간적, 성능적 낭비를 막기위한 기법이다.
- 많은 사용자가 접속하여 DB 커넥션과 종료가 남발하여 성능저하 및 페이지 마비가 일어날 수 있는 상황을 방지하는 용도
[참고] 커넥션 풀의 사용 이유
- Model 1 의 방식에서는 기능마다 DB에 접근하는데 DB 연동에 시간이 많이 걸린다는 단점이 있다.
- DB Connection Pool은 이러한 단점을 보완하기 위한 용도로 사용된다.

# JNDI
- 필요한 자원을 키/값의 형태로 저장하고 필요한 경우에 키를 이용하여 값을 받는 방법
- 웹 애플리케이션에서 DB Connection을 구현할 경우, Java SE에서 제공하는 javax.sql.DataSource 클래스를 사용한다.
- 웹 애플리케이션 동작 시 톰캣이 생성한 커넥션 풀 객체에 접근하는 경우 JNDI 방식을 이용한다.
웹 컨테이너가 커넥션 풀 객체를 생성할 시
객체의 명칭을 키값으로 미리 설정해두면 웹 어플리케이션이 DB와 연동 작업을 할 때 JNDI의 키값으로 접근한다.
사용 예시
- 웹 브라우저로부터 NAME/VALUE의 형태로 서블릿에서 getParameter(name)의 방식으로 값을 가져오는 경우
- HashMap등의 형태로 값을 가져오는 경우
- 웹 브라우저에서 도메인 네임으로 DNS 서버에 요청하여 도메인 네임에대한 IP주소를 가져오는 경우
연동 과정
(1) JDBC 드라이버 설치 (WEB-INF/lib)
(2) Connection Pool 기능 관련 jar 파일을 /WEB-INF/lib에 설치 혹은 POM.XML에 추가 (DBCP등)
(3) context.xml 에 Connection 객체 생성 시 연결할 DB 정보를 JNDI로 설정
(4) DB 연동 시, JNDI 방식으로 저장된 DB 명칭 (Key값) 으로 DB와 연동한다.
속성 | 의미 |
Name | DataSource에 대한 JNDI 명칭 |
Auth | 인증 주체 |
DriverClassName | 연결할 데이터베이스 종류에 따른 드라이버 클래스 명칭 |
Factory | 연결할 데이터베이스 종류에 따른 Connection Pool 생성 클래스 명칭 |
MaxActive | 동시에 최대로 데이터베이스에 연결할 수 있는 Connection 수 (한번에 접속 가능한 유저 수) |
MaxIdle | 동시에 IDLE 상태로 대기할 수 있는 최대 수 |
MaxWait | 새로운 연결이 생길 때까지 기다릴 수 있는 시간 (-1인 경우 무한으로 대기한다.) |
User | 데이터베이스 접속 ID |
Password | 데이터베이스 접속 PWD |
Type | 데이터베이스 종류별 DataSource |
Url | 접속할 데이터베이스 주소와 포트 번호 및 SID |