Tomcat 6 에서 DBCP를 설정하는 방법은
홈페이지 문서(http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html) 에 있으나, 저처럼 처음 하는 사람은 보고해도 잘 안되더군요.
몇 시간을 투자해서 설정하고, 이렇게 글을 남김.(이렇게 투자한 보람이 없으면 할 수 없고.. -_)/~ )
홈페이지에 보면 기본적으로 필요한 라이브러리는
- Jakarta-Commons DBCP
- Jakarta-Commons Collections
- Jakarta-Commons Pool
수정해야 하는 파일은
- server.xml
- context.xml
- web.xml
파일 임.
more..
1. server.xml 파일 <GlobalNamingResources>의 항목에 아래 내용을 추가한다.
<Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource"/>
<Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource"
username="사용자ID" password="비밀번호" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/사용할DB명?autoReconnect=true"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
maxActive="1000" maxIdle="30" maxWait="180"/>
3. web.xml 파일 <web-app>의 항목에 아래 내용을 추가한다.
<resource-ref>
<description>Mysql Datasource</description>
<res-ref-name>jdbc/MySQLDB</res-ref-name>
<res-auth>Container</res-auth>
</resource-ref>
4. 설정이 끝이 났으면 톰캣을 재실행한다.
5. 다음의 코드를 실행했을 때 값이 현재 시간이 출력이 된다면 정상 동작을 하는것이다.
<Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource"/>
Resource name 의 속성값(jdbc/MySQLDB)을 이용하여 각 어플리케이션에서 javax.sql.DataSource 객체를 얻어 간다.<ResourceParams name="jdbc/MySQLDB">
<parameter>
<name>username</name>
<value>사용자ID</value>
</parameter>
<name>username</name>
<value>사용자ID</value>
</parameter>
<parameter>
<name>password</name>
<value>사용자 PWD</value>
</parameter>
<name>password</name>
<value>사용자 PWD</value>
</parameter>
DB 접속 사용자 아이이와 비밀번호를 설정한다.
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/사용할DB명?autoReconnect=true</value>
</parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<name>maxWait</name>
<value>180</value>
</parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
사용되는 JDBC 드라이버를 명시한다.<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/사용할DB명?autoReconnect=true</value>
</parameter>
JDBC 연결 URL로 DB 서버와 네트워크가 끊어졌을 경우 POOL이 자동으로 Connection 들을 재설정한다.<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
사용 가능한 DB 연결이 적을 경우 DBCP가 활용되지 않는 또는 버려진 연결을 찾아 재활용하도록 하는 옵션.
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
DBCP에서 버려진 접속을 인식할 때까지의 시간을 지정( 기본 설정값은 60 => 300초의 의미라고 함. 60*5분=300초?)
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
사용되지 않는 DB 연결을 유발하는 코드를 찾을 수 있는 로그를 남기도록 설정하는 옵션.<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
DB 연결 풀의 최대 연결 개수로서 0을 입력하면 무제한이며, 숫자를 지정하면 mysql 데몬의 최대 연결 개수에 따라 그 값이 변동된다.
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
DB 연결 풀에서 동시에 대기상태로 있을 수 있는 연결 갯수. 0은 무제한이다.<parameter>
<name>maxWait</name>
<value>180</value>
</parameter>
DB 연결이 반환되는 시간으로 이 시간을 초과하는 경우 예외가 발생한다. 단위는 ms 이며 -1은 무한대기이다. (-1은 사용하지 말것.)
이외에 나머지 다른 설정도 있으나, 이 정도만해도 문제 없는것 같음..(순전히 아무것도 모르는 내 생각으로는 -_);; )
</ResourceParams>
</Context>
</Context>
이렇게 길게~ 각 항목을 설정해도 되지만, 너무 길어지는 관계로 다음과 같이 설정할 수도 있다.
<Resource name="jdbc/MySQLDB" auth="Container" type="javax.sql.DataSource"
username="사용자ID" password="비밀번호" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/사용할DB명?autoReconnect=true"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
maxActive="1000" maxIdle="30" maxWait="180"/>
2. context.xml 파일 <Context>의 항목에 아래 내용을 추가한다.
<ResourceLink global="jdbc/MySQLDB" name="jdbc/MySQLDB" type="javax.sql.DataSource"/>
server.xml 의 GlobalNamingResources 로 지정하였기 때문에 각 컨텍스트 설정에서 글로벌로 지정된 리소스를 사용할 수 있도록 지정을 해 주어야 함.
3. web.xml 파일 <web-app>의 항목에 아래 내용을 추가한다.
<resource-ref>
<description>Mysql Datasource</description>
<res-ref-name>jdbc/MySQLDB</res-ref-name>
이 이름이 바로 리소스 이름임.<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4. 설정이 끝이 났으면 톰캣을 재실행한다.
5. 다음의 코드를 실행했을 때 값이 현재 시간이 출력이 된다면 정상 동작을 하는것이다.
<%
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try
{
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env");
{
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/사용할DB명");
con = ds.getConnection();
stmt = con.createStatement();
stmt = con.createStatement();
String query = "select now()";
rs = stmt.executeQuery(query);
rs = stmt.executeQuery(query);
if(rs.next())
{
out.println(rs.getTimestamp(1));
}
}
catch(NamingException ne)
{
out.println(ne.toString());
}
catch(SQLException se)
{
out.println(se.toString());
}
finally
{
try { if ( rs != null ) rs.close(); } catch(Exception e) {}
try { if ( stmt != null ) stmt.close(); } catch(Exception e) {}
try { if ( con != null ) con.close(); con = null; } catch(Exception e) {}
}
%>
{
out.println(rs.getTimestamp(1));
}
}
catch(NamingException ne)
{
out.println(ne.toString());
}
catch(SQLException se)
{
out.println(se.toString());
}
finally
{
try { if ( rs != null ) rs.close(); } catch(Exception e) {}
try { if ( stmt != null ) stmt.close(); } catch(Exception e) {}
try { if ( con != null ) con.close(); con = null; } catch(Exception e) {}
}
%>
Posted by 라맨땅
