Dev Note/Tomcat 2008. 3. 10. 19:23

Java로 Web Service를 하기 위해 DB Connection Pool을 사용하지 않는 것은 이제 상상도 할 수가 없다. Java로 된 DB Connection Pool API는 수도 없이 많다. 대부분의 상용 WAS에서는 자기네 벤더에서 제공하는 DB Connection Pool이 있고, 그 외에도 무료로 제공되는 많은 DB Connection Pool 들이 있다. DBCP도 그중 하나이다.

DBCP(DataBase Connection Polling Service)는 Apache의 많은 Project 중 하나로 DataBase의 연결을 Pool에 생성해 놓고 재활용 및 관리를 가능하게 해주는 API이다. 여기서는 DBCP를 Tomcat에서 사용하기 위한 설정에 대해서 알아본다.

-- DBCP Install
Jakarta Commons DBCP Download : http://commons.apache.org/dbcp/downloads.html
Jakarta Commons Pool Download : http://commons.apache.org/pool/downloads.html
   è Generic object pooling component
Jakarta Commons Collections Download : http://commons.apache.org/downloads/download_collections.cgi
   è Extends or augments the Java Collections Framework
Java JDBC Driver : 사용하는 DataBase의 벤더가 제공하는 Driver를 사용한다.
Jakarta Commons DBCP API Document : http://commons.apache.org/dbcp/apidocs/index.html

위의 파일들을 다운 받은 jar 파일을 $CATALINA_HOME/common/lib 폴더에 복사한다. /WEB-INF/lib에 넣어두어도 무방하나, DB Connection Pool은 거의 모든 Context에서 사용하므로 모든 Context path의 /WEB-INF/lib 밑에 넣어두는 것보다는 $CATALINA_HOME/common/lib 밑에 넣어두는 것이 좋다.

-- DBCP Configuration Parameters
* Mandatory Parameters *
username : JDBC Driver로 연결할 DataBase의 사용자 계정 이름
password : JDBC Driver로 연결할 DataBase의 사용자 계정 비밀번호
url : JDBC Driver로 연결할 DataBase의 URL
driverClassName : DataBase 연결에 사용할 JDBC Driver Class 이름 (full path)

* Option Parameters - () 안의 값은 Default *
connectionProperties : DataBase 연결 시 사용할 Properties (charset 등 ...)

defaultAutoCommit (true) : DB Connection의 기본 auto-commit 상태 값
defaultReadOnly (driver default) : Pool에 DB Connection이 생성 될 때의 기본 read-only 상태 값
defaultTransactionIsolation (driver default) : Pool에 DB Connection이 생성 될 때의 기본 TransactionIsolation 상태 값. (NONE, READ_COMMITTED, READ_UNCOMMITED, REPEATABLE_READ, SERIALIZABLE 중 하나)
defaultCatalog (driver default) : Pool에 DB Connection이 생성 될 때의 기본 catalog 값

initialSize (0) : pool이 최초 동작할 때 생성 할 DB Connection
maxActive (8) : pool 내에서 동시에 최대로 생성할 수 있는 DB Connection (음수는 no limit)
maxIdle (8) : pool 내에서 대기 상태로 존재할 수 있는 최대 DB Connection (음수는 no limit)
minIdle (0) : pool 내에서 대기 상태로 존재할 수 있는 최소 DB Connection
maxWait (indefinitely) : pool에 DB Connection이 반환 될 최대 milliseconds (음수는 indefinitely)

validationQuery : DB Connection이 caller에게서 주거나 반환되기 전 해당 Connection이 사용가능한지 확인하는 쿼리
testOnBorrow (true) : DB Connection의 사용가능 여부 확인을 Caller가 pool에서 가져가지 전에 확인하는 것으로 지정한다. 만약 확인결과 사용불가능이면 pool에서 제거하고 다른 Connection을 준다.
NOTE - 이 값이 true이면 validationQuery 값은 non-null string 이어야 한다.
testOnReturn (false) : DB Connection의 사용가능 여부 확인 Caller가 pool에 반환하기 전에 확인하는 것으로 지정한다. 만약 확인결과 사용불가능이면 pool에서 제거하고 다른 Connection을 준다.
NOTE - 이 값이 true이면 validationQuery 값은 non-null string 이어야 한다.
testWhileIdle (false) : 유효하지 않은 DB Connection은 pool에서 제거한다.
NOTE - 이 값이 true이면 validationQuery 값은 non-null string 이어야 한다.
timeBetweenEvictionRunsMillis (-1) :  사용되지 않는 DB Connection을 추출하는 Thread의 실행주기 (단위 : milliseconds)
numTestsPerEvictionRun (3) : 사용되지 않는 Connection을 몇개 검사할지 지정
minEvictableIdleTimeMillis (1000 * 60 * 30) : 지정 시간만큼 대기상태인 DB Connection만 추출한다. (단위 : milliseconds)
poolPreparedStatements (false) : PreparedStatements가 풀링되어야 하는지 아닌지 설정
maxOpenPreparedStatements (unlimited) : open 된 최대 PreparedStatements 수

removeAbandoned (false) : 대기 상태로 removeAbandonedTimeout 이상동안 유지되면 Connection을 버릴 것인지 여부 설정
removeAbandonedTimeoout : removeAbandoned 하기 위한 Timeout (단위 : second)
logAbandoned : removeAbandoned에 의해 Connection을 버릴 때 로그로 남길지 여부

-- 설정 예
Context에 설정하기
   <Context path="dbcp" docBase="/home/app/www-root/dbcp/webapp" debug="5"
         reloadable="false" crossContext="true">
      <Resource name="jdbc/dbcpDB" auth="Container" type="javax.sql.DataSource"
            factory="org.apache.commons.dbcp.BasicDataSourceFactory"
            driverClassName="해당 JDBC Driver Class (oracle.jdbc.driver.OracleDriver)"
            url="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:[port]:[sid]"
            username="DataBase User Name (scott)" password="DataBase User Password (tiger)"
            initialSize="1" maxActive="10" maxIdle="5" maxWait="15000"
            removeAbandoned="true" removeAbandonedTimeout="120" logAbandoned="false"
      />
   />

web.xml 추가 설정
   <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/dbcpDB</res-ref-name> <!-- Context에 설정한 DBCP의 이름 -->
      <res-tyep>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>

이상이 DBCP 설정 방법 중 Context에 설정하는 방법에 대해 알아보았다. DBCP를 설정하는 방법은 여기서 소개한것 외에도 많다. 다음에는 DBCP를 web.xml에 Servlet 처럼 등록하여 설정정보를 암호화하여 로딩하는 방법과 예제 소스를 다뤄볼 것이다.
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 서류 2009.07.18 21:20  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.
    헉, 근데 페이지가 복사안돼서 링크 복사ㅋㅋ
    이 페이지 영원토록 공개 부탁드립니다~