○ Connection Pool 사용하기(JNDI, Context, DataSource)
기존의 웹 서버는 DB에 접근할 때마다 DB의 커넥션을 만들고, 커넥션을 해제하는 작업이 필요하다
이러한 작업은 DB 성능에 악영향을 끼친다(= JDBC의 문제점)
따라서 connection을 미리 만들어놓고, 요청이 들어오면 Connection Pool(connection을 모아두는 장소)에서 connection을 제공하고,
작업이 끝나면 connection pool에 반납하는 과정을 거치도록 구현하면 불필요한 작업을 제거할 수 있다
○ DataSource
DataSource 객체는 Connection Pool을 관리하는 인터페이스이다
이 객체는 JNDI(Java Naming & Directory Interface) 서버를 통해서 이용된다
■ 사용 절차
- JNDI Server에서 lookup() 메서드를 호출해 DataSource 객체를 얻는다
- DataSource의 getConnection() 메서드를 호출해 Connection 객체를 얻는다
- Connection을 가지고 DB 질의를 수행한다
- 질의가 끝나면 Connection 객체를 close() 해준다
○ JNDI
Java Naming & Directory Interface 서비스는 "이름"을 가지고 "객체"를 얻을 수 있는 서비스이다
DNS가 도메인으로부터 IP를 획득하는 서비스를 제공하는 것처럼 "이름"에 맺어진 "객체"를 반환하는 역할을 한다
JNDI는 context.xml 파일에 <Resource>라는 태그로 등록할 수 있다
[context.xml]
<Resource auth = "Container"
1) driverClassName = "com.mysql.cj.jdbc.Driver"
2) url = "jdbc:mysql://localhost/testDB"
3) username = "scott"
4) password = "tiger"
5) name = "jdbc/Mysql"
6) type = "javax.sql.DataSource"
7) maxTotal = "4"
8) maxWaitMillis = "10000"
/>
- dirverClassName : JDBC Driver의 경로를 입력한다
- url : 접속할 DB 서버의 url을 입력한다
- username : DB에 로그인할 계정 ID
- password : DB에 로그인할 계정 패스워드
- name : JNDI에 등록될 자원의 "이름"
- type : JNDI에서 "이름"을 찾았을 때 연결될 "객체"
=> DataSource를 통해 Connection을 제어하기 때문에 이를 지정한다 - maxTotal : 생성할 Connection의 갯수를 지정
- maxWaitMillis : 커넥션이 없을 때 스레드가 기다리는 시간(ms)
이 시간이 끝나면 Exception이 발생한다
■ context.xml에 등록한 자원의 정보에 추가하면 좋은 옵션들
- removeAbandonedOnBorrow = "true"
- logAbandoned = "true"
- removeAbandonedOnBorrow : 사용할 수 있는 커넥션이 부족해지면 DBCP(DataBase Connection Pool)은
버려진 커넥션을 찾아 복구한다
- logAbandoned : 커넥션 자원이 낭비되고 있는 위치를 로그로 출력한다
Connection Pool은 선택이 아닌 필수로 사용해야 하는 기술이다
'JSP' 카테고리의 다른 글
Expression Language(표현 언어) (0) | 2020.07.09 |
---|---|
Statement와 PreparedStatement (0) | 2020.07.08 |
JDBC 프로그래밍 (0) | 2020.07.06 |
Session과 Cookie (0) | 2020.07.04 |
page와 pageContext 내장 객체 (0) | 2020.07.03 |