Dev Note/Tomcat2008. 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 처럼 등록하여 설정정보를 암호화하여 로딩하는 방법과 예제 소스를 다뤄볼 것이다.
Posted by as.wind.914