달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2017. 7. 2. 22:50

자카르타 커넥션풀 2 C Jsp2017. 7. 2. 22:50

자카르타 프로젝트의 DBCP API를 사용할 때 과정


---------------------------------------------------------------------------
   1. DBCP 관련 Jar 파일 및 JDBC 드라이버 Jar 파일 설치하기
   2. 커넥션 풀 관련 설정 파일 초기화하기
   3. 커넥션 풀 관련 드라이버 로딩하기
   4. 커넥션 풀로부터 커넥션 사용하기
----------------------------------------------------------------------------


1. 필요한 Jar 파일 복사 : DBCP API를 사용하기 위해서는 다음과 같은 라이브러리가 필요하다.
                                    라이브러리의 최신 버전은 http://jakarta.apache.org/site/binindex.cgi 에서 다운로드

   * DBCP API 관련 Jar 파일                                        
   * DBCP API가 사용하는 자카르타 Pool API의 Jar 파일
   * Pool API가 사용하는 자카르타 Collection API의 Jar 파일 

     - DBCP 1.2.1 - commons-dbcp-1.2.1.zip
     - Pool 1.2 - commons-pool-1.2.zip
     - Collection 3.1 - commons-collections-3.1.zip

   이들 파일의 압축을 풀면 다음과 같은 Jar 파일들이 있는데, 이들 Jar 파일들을  \WEB-INF\lib 폴더에 복사한다
      commons-dbcp-1.2.1.jar
      commons-pool-1.2.jar
      commons-collections-3.1.jar



2. 커넥션 풀 설정 파일 작성하고 저장하기
     -> DBCP를 사용하는 방법에는 소스 코드 상에서 커넥션 풀을 설정하는 방법과 설정 파일을 통해서 커넥션 풀을 설정하는 방법 두가지 존재하는데
         설정 파일을 이용한 커넥션 풀 설정 방법에 대해서 살펴보도록 하겠다
    
   설정 파일의 위치
     -> DBCP API는 클래스패스로부터 설정 파일을 읽어온다. 따라서 앞서 작성한 커넥션 풀 설정 파일은 클래스패스에 위치해 있어야 한다.
         웹 어플리케이션에서 DBCP API와 관련된 설정 파일의 위치로 가장 좋은 곳은 WEB-INF\classes 폴더이다.

    pool.jocl
-----------------------------------------------------------------------------------------------------------------------
<object class="org.apache.commons.dbcp.PoolableConnectionFactory"
             xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">

  <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
    <string value="jdbc:oracle:thin:@localhost:1521:ORCL" />
    <string value="scott" />
    <string value="tiger" />
  </object>
   
    <object class="org.apache.commons.pool.impl.GenericObjectPool">
        <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
        <int value="10" /> <!--maxActive -->
        <byte value="1" /> <!-- whenExhaustedAction  -->
        <long value="10000" /> <!-- maxWait  -->
        <int value="10" /> <!-- maxIdle  -->
        <int value="3" /> <!-- minIdle  -->
        <boolean value="true" /> <!-- testOnBorrow  -->
        <boolean value="true" /> <!-- testOnReturn  -->
        <long value="600000" /> <!-- timeBetweenEvctionRunsMillis  -->
        <int value="5" /> <!-- numTestsPerEvctionRuns  -->
        <long value="3600000" /> <!--minEvctableTimeMillis -->
        <boolean value="true" /> <!--testWhileIdle -->
    </object>
   
    <object class="org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory"
            null="true" />
   
    <string null="true" />
   
    <boolean value="false" />
   
    <boolean value="true" />
</object>
-------------------------------------------------------------------------------------------------------------------------------

속성 설명
maxActive 커넥션 풀이 제공할 최대 커넥션 개수
whenExhaustedAction 커 넥션 풀에서 가져올 수 있는 커넥션이 없을 때 어떻게 동작할지를 지정한다. 1일 경우 maxWait 속성에서 지정한 시간만큼 커넥션을 구할 때 까지 기다리며, 0일 경우 에러를 발생시킨다. 2일 경우에는 일시적으로 커넥션을 생성해서 사용한다.
maxWait whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간. 단위는 1/1000초이며, 0 보다 작을 경우 무한히 대기한다.
maxIdle 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수. 음수일 경우 제한이 없다.
minIdle 사용되지 않고 풀에 저장될 수 있는 최소 커넥션 개수.
testOnBorrow true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사한다.
testOnReturn true일 경우 커넥션 풀에 커넥션을 반환할 때 커넥션이 유효한지의 여부를 검사한다.
timeBetweenEvctionRunsMillis 사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닐 경우 실행되지 않는다. 단위는 1/1000 초이다.
numTestsPerEvictionRun 사용되지 않는 커넥션을 몇 개 검사할지 지정한다.
minEvictableIdleTimeMillis 사용되지 않는 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않는다. 시간 단위는 1/1000초이다.
testWhileIdle true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거한다.

몇몇 속성은 성능에 중요한 영향을 미치기 때문에 웹 어플리케이션의 사용량에 따라서 알맞게 지정해주어야한다.

* maxActive  - 사이트의 최대 커넥션 사용량을 기준으로 지정. 동시 접속자수에 따라서 지정한다.

* minIdle      - 사용되지 않는 커넥션의 최소 개수를 0으로 지정하게 되면 풀에 저장된 커넥션의 개수가 0이 될 수 있으며, 
                       이 경우 커넥션이 필요할 때 다시 커넥션을 생성하게 된다. 따라서 커넥션의 최소 개수는 5개 정도로 지정해두는 것이 좋다.

* timeBetweenEvctionRunsMillis - 이 값을 알맞게 지정해서 사용되지 않는 커넥션을 풀에서 제거하는 것이 좋다. 
                       커넥션의 동시 사용량은 보통 새벽에 최저이며 낮 시간대에 최대에 이르게 되는데 이 두 시간대에 필요한 커넥션의 개수 차이는 
                       수십개에 이르게 된다. 이때 최대 상태에 접어들었더가 최소 상태로 가게 되면 풀에서 사용되지 않는 커넥션의 개수가 점차 증가
                       하게 된다. 따라서 사용되지 않는 커넥션은 일정 시간 후에 삭제되도록 하는 것이 좋다. 보통 10~20분 단위로 사용되지 않는
                       커넥션을 검사하도록 지정하는 것이 좋다.


* testWhileIdle - 사용되지 않는 커넥션을 검사할 때 유효하지 않은 커넥션은 검사하는 것이 좋다.

 

3. 커넥션 풀 초기화
    -> DBCP API를 통해서 커넥션 풀을 사용하기 위해서는 커넥션 풀과 관련된 JDBC 드라이버를 로딩해주어야 한다. 
        DBCP API를 사용할 때에 로딩해주어야 할 JDBC 드라이버는 다음과 같다.
        * org.apache.commons.dbcp.PoolingDriver - DBCP API의 JDBC 드라이버
        * DBMS에 연결할 때 사용될 JDBC 드라이버 

    -> 1. DBCP파일을(위의 2개의 드라이버를 로드하게끔) 만들고 web.xml에 설정해서 코딩시 드라이버 로드하는부분을 생략해도 되고
                                                               또는  
         2.코딩시   Class.forName("oracle.jdbc.driver.OracleDriver");
                        Class.forName("org.apache.commons.dbcp.PoolingDriver"); 를 써주고 코딩해도 된다.

         2번째 방법을 사용할때 web.xml에(오라클 드라이버를 정의해두고) 그값을 불러와서 사용할수도 있다(여러개의 DB를 사용하는경우
          web.xml 설정
          -----------------------------------------------------------------------------------
          <context-param>
             <description>jdbc driver</description>
             <param-name>jdbcdriver</param-name>
             <param-value>oracle.jdbc.driver.OracleDriver</param-value>
           </context-param>
          -----------------------------------------------------------------------------------

          코딩시
         String jdbcDriver = application.getInitParameter("jdbcdriver");
         Class.forName(jdbcDriver);
         Class.forName("org.apache.commons.dbcp.PoolingDriver");
          

   
4. 커넥션풀로부터 커넥션 사용하기
         String cpDriver="jdbc:apache:commons:dbcp:/dbpool/pool";
         conn = DriverManager.getConnection(cpDriver);

      
       ex)
<%
       Connection conn = null;
       Statement stmt = null;
       ResultSet rs = null;

       try{
              String jdbcDriver = application.getInitParameter("jdbcdriver");   //오라클 드라이버로드
              Class.forName(jdbcDriver);                                                          //오라클 드라이버로드
              Class.forName("org.apache.commons.dbcp.PoolingDriver");      //커넥션풀 드라이버로드
              String cpDriver="jdbc:apache:commons:dbcp:/chap9/pool2";    //커넥션풀 사용하기
              conn = DriverManager.getConnection(cpDriver);                        //커넥션풀 사용하여 객체생성
              String query ="select deptno,dname,loc from dept";                 // 쿼리문

              stmt = conn.createStatement();                                                 //stmt객체 생성
              rs = stmt.executeQuery(query);                                                 //결과값 받을 객체
              
              while(rs.next()) {
%>
.......
.......
<%
              }
      }
       finally {
               if(rs !=null) try{rs.close();}catch(SQLException ex){}                 //rs 객체 닫기
               if(stmt !=null) try{stmt.close();}catch(SQLException ex){}        //stmt 객체 닫기
               if(conn !=null) try{conn.close();}catch(SQLException ex){}        //conn객체 닫기
        }
%>  

 

 

 

 

 




'C Jsp' 카테고리의 다른 글

select box 정렬  (0) 2017.07.02
자카르타 커넥션풀 1  (0) 2017.07.02
JSP 에러페이지 처리  (0) 2017.07.02
액션태그  (0) 2017.07.02
JSP 스크립트 요소  (0) 2017.07.02
:
Posted by sfeg