Database Connection Pool (DBCP)의 사용

Database Connection Pool (DBCP)의 사용
관련 사이트
http://jakarta.apache.org/commons/dbcp/
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jndi-datasource-examples-howto.html#Database%20Connection%20Pool%20(DBCP)%20Configurations
http://jakarta.apache.org/tomcat/tomcat-4.1-doc/config/globalresources.html#Resource%20Parameters
http://jakarta.apache-korea.org/tomcat/tomcat-4.0-doc/jndi-resources-howto.html
Introduction
DBCP는 jakarta 프로젝트에서 지원하는 JDBC connection pool로 "http://jakarta.apache.org/commons/dbcp/" 이 곳에서 자세한 정보를 얻을 수 있으며 여기서는 Tomcat 4에서 제공하는 JNDI InitialContext 구현 인스턴스를 이용하여 사용하는 법에 대해 알아본다.
Download
"http://jakarta.apache.org/builds/jakarta-commons/release/commons-dbcp/v1.0/"
현재 release 버전은 v1.0이며 이곳에서 예제 및 샘플을 얻을 수 있다.
JNDI(Java Naming and Directory Interface)란?
네이밍 서비스(naming service)와 디렉토리 서비스(directory service)가 합쳐진 것으로 네이밍 서비스는 객체, 자원 서비스 등을 찾아주는 서비스를 의미하며 디렉토리 서비스는 트리 형태의 계층적인 정보를 서비스 하기 위한 것입니다. JNDI API는 javax.naming, javax.naming.directory, javax.naming.event, javax.naming.ldap, javax.naming.spi 패키지에서 지원된다.
Configurations
DBCP는 JVM 1.4를 이용하는 시스템과 JDBC 2.0에 제공된다.
DBCP INSTALL
구성파일
Jakarta-Commons DBCP 1.0 : commons-dbcp.jar
Jakarta-Commons Pool 1.0 : commons-pool.jar
Jakarta-Commons Collections 2.0 : commons-collections.jar
Jdbc Driver : oracle(classes12.zip), mssql(freetds_jdbc.snapshot.jar), mysql(mm.mysql-2.0.2-bin.jar)
사용하는 DB에 따라 적절한 드라이버가 필요하다.
위 jar 파일들은 $CATALINA_HOME/common/lib 이곳 폴더아래 위치해야만 한다.
만약 /WEB-INF/lib, 또는 $JAVA_HOME/jre/lib/ext, 또는 다른곳에 위치한다면 "드라이버를 찾을 수 없다"는 에러가 발생한다.
또한 Tomcat은 오직 jar 파일만 클래스패스에 추가가 되므로 zip파일은 가능하면 jar파일로 바꿔줘야 한다.
DBCP 설정
혹시 제주도에 가본적이 있는가?
갑자기 왠 제주도 얘길까 싶겠지만 딱딱하기만 한 커넥션 풀을 쉽게 풀기 위해 제주도를 무대로 설명하려 한다.
제주도는 우리나라의 대표적인 관광지이다. 매년 많은 USER가 방문하는 곳으로 보통 하루에 만명정도가 방문하며 동시 이용자가 200명 정도 된다. 제주도에는 가진거라곤 돈 뿐인 까오기라는 뚱땡이 부자가 있었다. 어느날 많은 방문자들을 보고 자신의 전재산을 털어 자동자 렌트 사업을 하기로 했다. 우선 전체 방문자와 그중에 자동차 이용자를 어느 정도 파악하고 그다음에 자신의 재산을 고려하여 주차 공간과 차를 사기로 했다. 회사이름을 꺼내숑뿔이라고 짓고 대지 천평에 자동차 100대(maxActive:100)를 샀다. 돈많은 관광객들이 많아 한동안 사업이 나날이 번창 했다. 그러던 어느날 문제가 발생하기 시작했다. 차가 여기 저기 고장도 나고 사람들이 별로 선호 하지 않는 자동차가 생긴것이다. 이용자는 많은데 안쓰는 차가 주차 공간을 차지 하고 있어 이를 처리해야 할 처지이다. 그래서 리무브 대리가 폐차 계획(removeAbandoned:TRUE)을 짜기로 했다. 우선 무조건 팔아버리긴 아까우니 최소 한달은 기다렸다가 그때도 사람들이 안쓰면 팔기로 했다. (removeAbandonedTimeout:30일) 근데 사장은 리무브 대리가 무슨 짓을 저지르는지 알고 싶어 일일이 기록하라고 로그장부(logAbandoned:TRUE)에 기재 토록 시켰다. 또 똥돼지 파동으로 냄새난다고 관광객이 줄어 들어 놀고 있는 차를 팔고 필요하면 다시 사기로 했다. 어찌나 냄새가 나는지 관광객이 너무 줄어서 100대의 차중에 80대가 놀고 있었다. 이차들을 계속 유지하는 것도 힘들어 맥씨 아들(maxIdle)에게 노는 차를 조사하다 20대가 넘으면 나머진 팔아 버리라고 시켰다. 똥돼지들은 나날이 냄새를 풍기고 관광객은 점점 줄어만 갔다. 그러던중 사업장 부지에 대규모 관광단지가 조성되게 되어 땅값이 엄청나게 올랐다. 그래서 꺼내숑뿔 회사는 부자가 됐다. ^^
위에 웃기지도 않은 이야기가 대강의 이해를 도왔다면 아래 실제 소스를 보겠다.
server.xml에 다음과 같은 코딩이 필요하다.
removeAbandonedTimeout은 어느 정도의 시간 지나면 버릴것인가를 결정하는 것이다.(60초라면)
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
logAbandoned 파라미터는 커넥션 자원이 버려질때 로그로 기록 될것인가를 결정하는 것으로 기본은 false이다.
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
MySQL DBCP Example
Configurations
MySQL 3.23.47, MySQL 3.23.47 using InnoDB, MySQL 4.0.1alpha
mm.mysql 2.0.14 (JDBC Driver)
testdata 테이블 생성
mysql> create table testdata (
-> id int not null auto_increment primary key,
-> foo varchar(25),
-> bar int);
테스트 데이터의 삽입
mysql> insert into testdata values(null, 'hello', 12345);
Query OK, 1 row affected (0.00 sec)
mysql> select * from testdata;
+----+-------+-------+
| ID | FOO | BAR |
+----+-------+-------+
| 1 | hello | 1234 |
+----+-------+-------+
1 row in set (0.00 sec)
mysql>
server.xml 설정
$CATALINA_HOME/conf/server.xml 이곳에 파일을 열고 해당 컨텍스트를 수정한다.
기존 컨텍스트
<Context path="/kkaok" docBase="c:/kkaok" debug="0" reloadable="true"/>
변경
<Context path="/kkaok" docBase="c:/kkaok" debug="0" reloadable="true"> <!-- 이름과 어플리케이션에서 유효한 자원의 데이터 형을 지정합니다. --> <Resource name="jdbc/jack1972" auth="Container" type="javax.sql.DataSource"/> <!-- 사용할 자원 factory implementation 의 자바 클래스명과 자원 factory 를 설정하는 데 사용되는 JavaBeans 프로퍼티를 설정합니다.--> <ResourceParams name="jdbc/jack1972"> <!-- 아이디 --> <parameter> <name>username</name> <value>userName</value> </parameter> <!-- 패스워드 --> <parameter> <name>password</name> <value>userPassword</value> </parameter> <!-- 드라이버 --> <parameter> <name>driverClassName</name> <value>org.gjt.mm.mysql.Driver</value> </parameter> <!-- url --> <parameter> <name>url</name> <value>jdbc:mysql://localhost/kkaokDB</value> </parameter> <!-- 불필요한 커넥션 제거 --> <parameter> <name>removeAbandoned</name> <value>true</value> </parameter> <!-- 삭제할 최대 시간 결정 --> <parameter> <name>removeAbandonedTimeout</name> <value>60</value> </parameter> <!-- 삭제 기록 유무 --> <parameter> <name>logAbandoned</name> <value>true</value> </parameter> <!-- 사용하는 커낵션 최대수 --> <parameter> <name>maxActive</name> <value>25</value> </parameter> <!-- 사용 안하고 있는 커넥션의 최대수 --> <parameter> <name>maxIdle</name> <value>10</value> </parameter> <!-- 커넥션을 열기위해 최대 기다리는 시간 "-1"이라면 무기한 기다린다. --> <parameter> <name>maxWait</name> <value>-1</value> </parameter> </ResourceParams> </Context> |
web.xml 설정
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd> <web-app> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/jack1972</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> |
Test code
<%@ page contentType="text/html;charset=MS949"%> |
tomcat을 재시동하시고 브라우져를 통해 확인하면 된다.
'My work space > JSP/Servlet' 카테고리의 다른 글
게시판만들기-페이지나누기(펌)ASP (0) | 2008.09.08 |
---|---|
게시판 만들기 - 수정, 삭제하기(펌) (0) | 2008.09.08 |
서블릿 forward와 include의 비교 (0) | 2008.09.08 |
쿠키 관련 (0) | 2008.09.08 |
HttpSessionBindingListener로 구현한 중복로그인체크(3) (0) | 2008.09.08 |