'DBCP'에 해당되는 글 1건

  1. 2007.11.05 DBCP 설정 (1)

DBCP 설정

폴더 구조
\ ┐
  └ src
     └ util
  └ web
  └ WEB-INF
     └ classes
         └ pool1.jocl
  └ web.xml

공통.
eclipse에 Tomcat을 연결하고(참조)
eclipse에서 File -> New -> Project -> Tomcat Project를 선택한다. Project 명 : ConnectionPoolTest
그러면 %Apache Home%\conf\Catalina\localhost 에 [Project 명].xml 파일이 생성된다.

방법 1.
(ex D:\ProjectA\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\ConnectionPoolTest.xml)

xml 파일을 열어보면
<Context path="/ConnectionPoolTest" reloadable="true" docBase="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest" workDir="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest\work" />
이렇게 설정되어 있다. 의미는 /ConnectionPoolTest로 접근하면 docBase로 재전송하라는 의미 정도.

이 내용을
<Context path="/ConnectionPoolTest" reloadable="true" docBase="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest" workDir="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest\work" >

<Resource name="jdbc/JAVA2"        <!-- DB JNDI name -->
   auth="Container" type="javax.sql.DataSource"
   factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
   driverClassName="oracle.jdbc.driver.OracleDriver" <!-- Oracle -->
   url="jdbc:oracle:thin:@10.10.10.10:1111:TEST"  <!-- DB 설정 정보(ip:port:sid) -->
   username="scot" password="tiger"      <!-- ID/Password -->
   maxActive="20"
   maxIdle="10"
   maxWait="-1"
   removeAbandoned="true"
   removeAbandonedTimeout="60"
   logAbandoned="true"/>

</Context>

이렇게 수정해준다.
그리고 나서 %Apache Home%\conf\web.xml을 열어서(D:\ProjectA\Apache Software Foundation\Tomcat 5.5\conf)
 <display-name>ConnectionPoolTest</display-name>
 <resource-ref>
        <description>Oracle Development Datasource</description>
        <res-ref-name>jdbc/JAVA2</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
위의 내용을 추가한다.

마지막으로 아래 내용으로 jsp 파일을 생성한다.
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="javax.sql.*,javax.naming.*,java.sql.*" %>


<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try{
    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource) envContext.lookup("jdbc/JAVA2");
    conn = ds.getConnection();

    String sql = "SELECT count(*) as cnt FROM a WHERE b IN ('xxx','yyy') ";
    out.println(sql);
    out.println("<br><br><br>");
    pstmt = conn.prepareStatement(sql);
    rs = pstmt.executeQuery();

    while(rs.next()){
%>
        <%="Count : " + rs.getString(1)%>

<%       
    }

}catch(Exception e){
    e.printStackTrace();
}finally{
    if(rs != null) try{rs.close();}catch(SQLException sqle){}
    if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){}
    if(conn != null) try{conn.close();}catch(SQLException sqle){}
}
%>

Tomcat 구동 후 http://localhost:8000/ConnectionPoolTest/web/DBCP_Test2.jsp로 접속한다.
(oracle을 설치한 경우 Tomcat은 8080 대신 8000 포트를 기본으로 설정해준다.)

화면에 결과가 뿌려진다.

방법 2.
web.xml을 열어서 아래 내용 추가.
 <display-name>CPTest</display-name>
 
    <!-- Apache DBCP Connection Pool -->
    <servlet> <!-- DBCP 연동 서블릿 -->
        <servlet-name>DBCPServlet</servlet-name>
        <servlet-class>util.DBCPServlet</servlet-class>
        <init-param> <!-- Connection Pool Name -->
            <param-name>registerPool</param-name>
            <param-value>TEST</param-value>
        </init-param>
        <init-param><!-- JDBC Driver -->
            <param-name>jdbcDriver</param-name>
            <param-value>oracle.jdbc.driver.OracleDriver</param-value>
        </init-param>
        <init-param><!-- Oracle 서버의 주소 -->
            <param-name>jdbcURL</param-name>
            <param-value>jdbc:oracle:thin:@10.10.10.10:1111:TEST</param-value>
        </init-param>
        <init-param><!-- 계정명 -->
            <param-name>user</param-name>
            <param-value>scot</param-value>
        </init-param>
        <init-param><!-- 패스워드 -->
            <param-name>password</param-name>
            <param-value>tiger</param-value>
        </init-param><!-- 자동 실행 순서, 0보다 큰 값이면 자동 실행 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

ConnectionPoolTest.xml 파일을 열어서 이렇게 되어 있는지 확인.
<Context path="/ConnectionPoolTest" reloadable="true" docBase="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest" workDir="D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest\work" />
의미는 /ConnectionPoolTest로 접근하면 docBase로 재전송하라는 의미 정도.

파일 생성

ConnectionPoolMgr.java

DBCPServlet.java

DBCP_Test.jsp

Tomcat 구동 후 http://localhost:8000/ConnectionPoolTest/web/DBCP_Test.jsp로 접속한다.
(oracle을 설치한 경우 Tomcat은 8080 대신 8000 포트를 기본으로 설정해준다.)

화면에 결과가 뿌려진다.
※ web.xml의 설정에 따라 서버가 구동되면서 DBCPServlet이 함께 구동되고, ConnectionPoolMgr을 통해서
DBCP pool의 connection을 할당받는다. ConnectionPoolMgr를 수정하면 다양한 형태(JAVA Application, EJB,…)로 connection을
할당받을 수 있다.


방법 3.
방법 2가 web.xml 에 설정 내용을 직접 적는 방식이었다면
방법 3은 설정 파일을 이용해서 설정 내용을 관리한다.

D:\Sedo\Reference_coding\Java\Source\ConnectionPoolTest\WEB-INF\classes 에 poll1.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:@10.10.10.10:1111:TEST" />
        <string value="scot" />
        <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" />    <!-- numTestsPerEvictionRun -->
        <long value="3600000" />  <!-- minEvictableIdleTimeMills -->
        <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>

web.xml 에서 설정 내용을 정리하고, Servlet 설정만 남긴다.
    <!-- Apache DBCP Connection Pool -->
    <servlet> <!-- DBCP 연동 서블릿 -->
        <servlet-name>DBCPinit</servlet-name>
        <servlet-class>util.DBCPinit</servlet-class>
        <init-param><!-- JDBC Driver -->
            <param-name>jdbcDriver</param-name>
            <param-value>oracle.jdbc.driver.OracleDriver</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

DBCPinit.java

ConnectionPoolMgrInit.java

DBCP_Test3.jsp

※ 참고
1. DriverManager의 메서드를 사용하는데 있어서의 문제점은, DriverManager class가 동기적인 class이기 때문에 발생합니다.
동기적이라는 것은, DriverManager의 메서드를 하나의 스레드 안에서만 한번에 실행할 수 있다는 것을 의미합니다.
그렇기 때문에 멀티 스레드 구조로 되어있는 DataSource 기술을 이용하는 것이 좋습니다.
http://maxnim.tistory.com/1166705736

2.
DBCP_Test.java

3.
DBCP DriverManager 참고 자료
http://www.javastudy.co.kr/docs/lec_jdbc/jdbc/3_drivermanager.html

DBCP 설정 및 사용 관련
http://blog.naver.com/qkek0179?Redirect=Log&logNo=30021580294
http://blog.naver.com/utsman?Redirect=Log&logNo=110009623685
http://blog.naver.com/ssk8073?Redirect=Log&logNo=110022096415
http://ilus.tistory.com/66
http://blog.naver.com/tank9567?Redirect=Log&logNo=110022045087
http://blog.naver.com/mydreamsj?Redirect=Log&logNo=150022793276

Posted by 라딘.

댓글을 달아 주세요

  1. 빨간망또차차 2008.03.14 17:14 신고  댓글주소  수정/삭제  댓글쓰기

    글 담아 갈께요~