본문 바로가기

JSP

Connection Pool

○ 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) 서버를 통해서 이용된다


■ 사용 절차
  1. JNDI Server에서 lookup() 메서드를 호출해 DataSource 객체를 얻는다
  2. DataSource의 getConnection() 메서드를 호출해 Connection 객체를 얻는다
  3. Connection을 가지고 DB 질의를 수행한다
  4. 질의가 끝나면 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"
/>



  1. dirverClassName : JDBC Driver의 경로를 입력한다
  2. url : 접속할 DB 서버의 url을 입력한다
  3. username : DB에 로그인할 계정 ID
  4. password : DB에 로그인할 계정 패스워드
  5. name : JNDI에 등록될 자원의 "이름"
  6. type : JNDI에서 "이름"을 찾았을 때 연결될 "객체"
       => DataSource를 통해 Connection을 제어하기 때문에 이를 지정한다
  7. maxTotal : 생성할 Connection의 갯수를 지정
  8. maxWaitMillis : 커넥션이 없을 때 스레드가 기다리는 시간(ms)
          이 시간이 끝나면 Exception이 발생한다

■ context.xml에 등록한 자원의 정보에 추가하면 좋은 옵션들
  • removeAbandonedOnBorrow = "true"
  • logAbandoned = "true"
  1. removeAbandonedOnBorrow : 사용할 수 있는 커넥션이 부족해지면 DBCP(DataBase Connection Pool)은
                   버려진 커넥션을 찾아 복구한다
  2. 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