커넥션 풀
▷ 데이터베이스와 연결된 커넥션을 미리 만들어 풀(Pool)속에 저장해 두고 있다가 필요할 때 커넥션 풀에서 가져다 쓰고
다시 커넥션 풀에 반환하는 기법
▷ 풀 속에 데이터베이스와 연결된 커넥션을 미리 생성해 놓고, 데이터베이스 커넥션이 필요할 때마다 생성해놓은 커넥션을 가져다 사용하고
사용이 끝나면 풀에 다시 가져다 놓는다.
커넥션 풀 특징
▷ 미리 커넥션을 생성해 놓기 때문에 커넥션을 생성하는 데 드는 연결 시간을 줄일 수 있다. -> 웹 어플리케이션의 속도 향상
▷ 커네션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 일정하다. -> 동시 접속자 수가 몰려도 쉽게 다운되지 않는다.
커넥션 풀 라이브러리
▷ 오픈소스 DBCP API 다운로드
commons DBCP API : https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
commons Pool API : https://commons.apache.org/proper/commons-pool/download_pool.cgi
commons Logging API : https://commons.apache.org/proper/commons-logging/download_logging.cgi
다운 받은 zip 파일의 압출을 풀고 폴더 안의 jar파일을 웹 프로젝트의 WEB-INF/lib 폴더에 복사한다.
커넥션 풀 초기화 서블릿 클래스
▷ https://github.com/madvirus/jsp23/blob/master/eclipse/chap14/src/jdbc/DBCPInit.java
▷ 커넥션 풀 초기화 서블릿 등록
웹 어플리케이션을 구동할 때 이 서블릿을 실행 할 수 있도록 web.xml에 등록한다.
<servlet>
<servlet-name>서블릿 이름(DBCPInit)</servlet-name>
<servlet-class>클래스(jdbc.DBCPInit)</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
커넥션 풀 사용
▷ PoolingDriver : 커넥션 풀을 위한 JDBC 드라이버
▷ 커넥션 풀 초기화 서블릿에서 등록한 커넥션 풀 이름을 사용한다.
Class.forName("org.apache.commons.dbcp2.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp");
driver.registerPool("커넥션풀 이름",connectionPool);
▷ 커넥션 풀 사용
Connection conn = null;
try {
String jdbcurl = "jdbc:apache:commons:dbcp:커넥션풀이름"); //커넥션 풀에서 커넥션을 구함
conn = DriverManager.getConnection(jdbcurl);
...
} finally{
if(conn != null)
try{
conn.close(); // 커넥션을 풀에 반환
} catch(SQLException ex){}
}
커넥션 풀 속성
▷ GenericObjectPoolConfig 클래스 커넥션 개수와 대기 관련 메소드
메소드 | 기본값 | 설명 |
setMaxTotal(int) | 8 | 풀이 관리하는 커넥션의 최대 개수를 설정한다. 음수면 제한이 없다. |
setMaxIdle(int) | 8 | 커넥션 풀이 보관할 수 있는 최대 유휴 개수를 지정한다. 음수면 제한이 없다. |
setMinIdle(int) | 0 | 커넥션 풀이 유지할 최소 유휴 커넥셩 개수를 지정한다. 값이 MaxIdle보다 크녕 MaxIdle을 MinIdle 값으로 사용한다. |
setBlockWhenExhausted(boolean) | true | 풀이 관리하는 커넥션이 모두 사용중인 상태일 때 커넥션을 요철할 때 풀에 너켁션이 반환될 때까지 대기 할지의 여부를 지정한다. true=대기, false=NoSuchElementException 발생 |
setMaxWaitMilis(long) | -1L | BlockWhenhasueted가 true일 때, 최대 대기 시간을 설정한다. 음수면 풀에서 커넥션을 구할 수 있을 때까지 대기한다. 단위는 밀리초 |
▷ GenericObjectPoolConfig 클래스 유휴 커넥션 제거 및 검사 관련 메소드
메소드 | 기본값 | 설명 |
setTimeBetweenEvictionRunsMilis(long) | -1L | 풀에 있는 유휴 커넥션 검사 주기를 설정. 음수면 검사하지 않는다. 단위는 밀리초 |
setNumTestsPerEvictionRun(int) | 3 | 각 주기 때마다 검사할 커넥션의 개수를 설정한다. 음수면 유휴 커넥션 개수를 검사 개수의 절대값으로 나눈 갑슬 사용한다. |
setMinEvictableIdleTimeMilis(long) | 1800000L | 풀에 머물 수 있는 최소 유휴 시간을 설정한다. 커넥션을 검사할 때 이 시간을 초과한 커넥션이 제거 대상이 된다. 이 시간이 양수가 아니면 유휴 시간으로 검사하지 않는다. 단위는 밀리초 |
setTestWhileIdle(boolean) | false | true면 유휴 커넥션이 유효한지 검사한다. |
setTestOnBorrow(boolean) | false | true면 커넥션 풀에서 커넥션을 가져올 때 유효한지 검사한다. |
setTestOnReturn(boolean) | false | true면 커넥션을 풀에 반환할 때 유효한지 검사한다. |
▷ PoolableConnectionFactory 클래스 커넥션 검사 기능 관련 메소드
메소드 | 기본값 | 설명 |
setMaxConnLifetimeMilis(long) | -1L | 커넥션의 최대 사용 시간을 설정한다. 커넥션을 생성한 뒤 최대 사용 시간이 지나면 유효하지 않는 것으로 간주한다. 양수가 아니면 적용하지 않는다. 단위는 밀리초 |
setValidationQuery(String) |
| 커넥션을 검사할 때 사용할 쿼리를 설정한다. |
'WEB > JSP Servlet' 카테고리의 다른 글
필터 (0) | 2016.12.09 |
---|---|
JDBC : 트랜잭션 (0) | 2016.12.06 |
MVC 패턴과 모델 (0) | 2016.11.22 |
서블릿 : 초기화 (0) | 2016.11.22 |
서블릿 : 기본 (0) | 2016.11.21 |