쌍용 강북 교육센터 국비학원 Day 64일차
Connection Pool
Connection 은 데이터베이스 서버에 연결하기 위해 사용되어지는 객체이다. 객체는 새롭게 만들어질때 시스템 자원(CPU, 메모리) 의 많은 소모와 시간이 걸리게 된다. 특히 DAO 클래스에서 사용하는 메소드 (insert, select, update, delete 등) 를 작성하려면 매번 Connection 객체 생성을 필요로 하게된다. 매번 이 객체를 생성해서 사용해야 한다는것은 자원소모가 크므로 이를 해결하기 위해 나온 방법이 Connection Pooling 기법이다.
Connection Pool 은 미리 처음부터 여러개의 Connection 객체를 만들어 두고서 DAO 클래스의 메소드를 호출할때 마다 미리 만들어둔 객체를 공유해서 사용하는 것으로 시스템 자원의 절약과 더불어 시간을 단축할 수 있게 된다. 톰캣서버에서도 이러한 Connection Pooling 기법을 제공하고 있는데 이것을 자카르타톰캣 DBCP (DB Connection Pool) 라고 부른다.
DBCP (Data Base Connection Pool)
- 데이터 베이스와 연결될 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 의미한다.
Connection Pool 의 장점
- 풀 속에 이미 커넥션이 생성되어져 있으므로 커넥션을 생성하는 데 필요한 연결 시간이 소모되지 않는다.
- 커넥션을 계속해서 재사용하기 때문에 특별한 케이스를 제외하면 새로 생성되는 커넥션 수는 없다고 봐도 무관하다.
- 커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 필요하지 않으므로 그만큼 어플리케이션의 실행 속도가 빨라지고, 또한 WAS의 context.xml 에 기술하는 값에 따라 한 번에 생성될 수 있는 커넥션 수를 제어할 수 있으므로 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다. 즉, 서버의 부하를 줄여주고, 서버의 한정적인 자원을 효율적으로 사용할 수 있다. (웹 프로그래밍에 중요한 기법이다)
※ 동시에 많은수의 접속자 처리를 하기 방법
- 커넥션 풀에 들어있는 커넥션의 갯수는 한정적이므로 커넥션 풀은 누군가 접속하면 커넥션 풀에 남아 있는 커넥션을 제공하는 방법으로 운영된다. 하지만 남아있는 커넥션이 없을 경우 해당 클라이언트는 대기 상태로 전환이 되고, 커넥션이 반환되면 대기하고 있는 순서대로 커넥션이 제공된다.
그러므로 동시에 많은수의 접속자 처리를 하기 위해서는 WAS 서버의 물리적인 메모리(RAM) 의 크기를 증설한후 context.xml에 maxActive 와 maxIdle 값을 적절하게 조절해야 한다.
※ Oracle DBCP 설정방법
1. 이클립스에서 톰캣서버를 stop 시킨 후 톰캣서버를 삭제한다.
2. 탐색기에서 C:\apache-tomcat-9.0.55\conf\context.xml 파일을 편집한다.
3. Context configuration 만들기
<Context reloadable="true" privileged="true"> 태그 속의 Manager pathname 밑에 해당 소스를 추가한다.
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
username="mymvc_user" password="aclass" maxTotal="20" maxIdle="10"
maxWaitMillis="-1"/>
- maxTotal - 커넥션 풀이 제공할 최대 커넥션 갯수
- maxIdle - 사용되지 않고 커넥션 풀에 남아 있을 수 있는 최대 커넥션 갯수. 음수일 경우, 사용되지 않고 커넥션 풀에 남아 있을 수 있는 최대 커넥션 갯수는 제한이 없다.
- maxWait - 커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 대기 시간. 단위는 1/1000초, 0보다 작을 경우 무한히 대기.
- minIdle - 최소한으로 유지할 커넥션 개수
- initialSize - 최초로 getConnection() Method를 통해 커넥션 풀에 채워 넣을 커넥션 개수
예) maxTotal="20" maxIdle="10" maxWait="-1" 은 커넥션 풀이 제공할 최대 커넥션 갯수는 20개로써 사용되지 않고 커넥션 풀에 남아 있을 수 있는 커넥션 갯수는 0개 ~ 최대10개 까지이다. 다시말해서 최소한 10개는 커넥션 풀에 남아있으면 안되고 무조건 사용되어야 하고, 커넥션 풀에 남아 있을 수 있는 커넥션 갯수도 모두 사용되어 0개 이거나 최대 10개 까지는 사용되지 않고 사용하기 위해 대기상태로 두겠다는 뜻이다.
4. web.xml configuration 만들기
- 이클립스에서 /webapp/WEB-INF/web.xml 파일을 열어서 아래 소스를 추가하고 저장한다.
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
5. 이클립스에서 삭제했던 톰캣서버를 새로 생성해준다.
- 만약에 본인 컴퓨터의 사양이 조금 떨어지는 경우라면 생성된 톰캣서버를 더블클릭하여 Overview 탭에서 Timeouts 의 Start (in seconds) 45 를 60 으로 증가시키고 Stop (in seconds) 15 를 30 으로 증가시키도록 한다.
※ Start (in seconds) 60 은 톰캣서버 구동시 최대 60초 안에는 구동되어야 한다는 뜻이고 Stop (in seconds) 30 은 톰캣서버 중지시 최대 30초 안에는 중지되어야 한다는 뜻이다.
6. 이클립스에서 /Servers/Tomcat v9.0 Server at localhost-config/context.xml 파일에서 4번에서 추가한 소스코드가 추가되어 있으면 완료.
앞으로 생성되어질 DAO 클래스 생성 예)
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
※ 톰캣에서 제공하는 Oracle DBCP 설정하는 방법
http://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#Oracle_8i,_9i_&_10g
※ 프로젝트 관련 JSP 구축 순서
1. key (url매핑) = value (패키지명.클래스명) 관련 properties 작성
(properties value 수정시 충돌할 경우 해당 클래스를 삭제하고 재생성)
2. 통합 서블릿 작성
3. 각자가 구현한 메소드가 충돌이 되지 않도록 메소드를 강제로 구현하기 위한 인터페이스 작성
4. 각자의 구현할 컨트롤러 작성
5. 로그인과 같은 공통인 메소드를 공동으로 구현하기 위해 부모클래스(컨트롤러) 정의
※ 부모 컨트롤러는 추상클래스이며, 모든 컨트롤러는 부모 컨트롤러를 상속받고 인터페이스를 implements 한다.
'Web > JSP' 카테고리의 다른 글
쌍용강북교육센터 국비 학원 Day 67일차 JSP (session 세션) (0) | 2023.04.09 |
---|---|
쌍용강북교육센터 국비 학원 Day 66일차 JSP (암호화/복호화, Ajax, Json) (0) | 2023.04.06 |
쌍용강북교육센터 국비 학원 Day 63일차 JSP (MVC 패턴) (0) | 2023.04.03 |
쌍용강북교육센터 국비 학원 Day 62일차 JSP 구현 (0) | 2023.03.31 |
쌍용강북교육센터 국비 학원 Day 61일차 JSP (JSTL - 커스텀 액션, EL) (0) | 2023.03.30 |