본문 바로가기
IT/MyBatis

DBCP와 iBatis를 통한 Connection Pooling

by 최고영회 2013. 12. 24.
728x90
반응형
SMALL

프로젝트 개발을 하다보면 light한 환경을 요하는 경우가 있습니다. 이럴 경우 spring framework를 대신하여 dbcp + ibatis를 가지고 개발을 진행하는 경우도 발생할 것입니다. 이럴 경우 유용하리라 생각되어 설치과정을 공유합니다.

일단 Tomcat 환경에서 설치 과정을 설명하겠습니다.

1. DBCP 설치
 - 실치 과정은 여기에 가시면 설치과정을 설명해 놓았습니다.
 
2. iBatis 설치
 - 여기에 가서 다운로드
 - ${ProjectWebRoot}/WEB-INF/lib에 ibatis-2.3.0.677.jar 카피

3. sqlmap.xml 정의
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
        PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
        "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <properties resource="com/mimul/dwr/app/resource/database.properties"/>
    <settings
            cacheModelsEnabled="true"
            enhancementEnabled="true"
            lazyLoadingEnabled="true"
            maxRequests="40"
            maxSessions="20"
            maxTransactions="5"
            useStatementNamespaces="false"
            />
    <transactionManager type="JDBC">
        <dataSource type="DBCP">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>

            <!-- OPTIONAL PROPERTIES BELOW -->
                <property name="initialSize" value="5"/>
                <property name="maxActive" value="30"/>
                <property name="maxIdle" value="20"/>
                <property name="maxWait" value="60000"/>
                <property name="poolPreparedStatements" value="true"/>
                <property name="validationQuery" value="select 0 from dual"/>
                <property name="testOnBorrow" value="true"/>
                <property name="maximumActiveConnections" value="10"/>
                <property name="maximumIdleConnections" value="5"/>
                <property name="maximumWait" value="60000"/>
                <property name="logAbandoned" value="false"/>
                <property name="removeAbandoned" value="false"/>
                <property name="removeAbandonedTimeout" value="50000"/>
        </dataSource>
    </transactionManager>
    <sqlMap resource="com/mimul/dwr/app/sql/Mimul.xml"/>
</sqlMapConfig>
4. com/mimul/dwr/app/resource/database.properties 정의
driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@mimuluserdb:1521:mimuluser
username=mimuluser
password=mimuluser
5. com/mimul/dwr/app/sql/Mimul.xml 정의
 - DDL2iBatis.exe를 활용하여 자동 생성하게 하는 것이 개발 속도가 올라갑니다.
<?xml version='1.0'?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Mimul">
    <cacheModel id="mimul-cache" type="MEMORY">
        <flushInterval hours="24"/>
        <flushOnExecute statement="insertMimul"/>
        <flushOnExecute statement="updateMimul"/>
        <flushOnExecute statement="deleteMimul"/>
        <property name="reference-type" value="WEAK" />
    </cacheModel>
    <resultMap class="com.mimul.dwr.model.Mimul" id="mimul-result" >
        <result property="lseq" column="lseq" />
        <result property="sseq" column="sseq" />
        <result property="assetid" column="assetid" />
        <result property="title" column="title" />
        <result property="imgurl" column="imgurl" />
        <result property="vodurl" column="vodurl" />
        <result property="use" column="use" />
        <result property="chgdate" column="chgdate" />
    </resultMap>
    <select id="getMimul" resultClass="com.mimul.dwr.model.Mimul"
parameterClass="Integer" >
        <![CDATA[
            SELECT lseq, sseq, assetid, title, imgurl, vodurl, use, chgdate
            FROM   mimul
            WHERE  lseq = #lseq#
        ]]>
    </select>
    <update id="updateMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <![CDATA[
            UPDATE mimul
            SET    sseq = #sseq#,  assetid = #assetid#,  title = #title#, 
imgurl = #imgurl#,  vodurl = #vodurl#,  use = #use#, 
chgdate = #chgdate#
            WHERE  lseq = #lseq#
        ]]>
    </update>
    <insert id="insertMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <selectKey resultClass="int"  keyProperty="lseq" >
            SELECT mimul_lseq_seq.nextval as lseq FROM dual
        </selectKey>
        INSERT INTO mimul (lseq, sseq, assetid, title, imgurl, vodurl,
use, chgdate)
        VALUES (#lseq#, #sseq#, #assetid#, #title#, #imgurl#, #vodurl#,
#use#, #chgdate#)
    </insert>
    <delete id="deleteMimul" parameterClass="com.mimul.dwr.model.Mimul" >
        <![CDATA[
            DELETE FROM mimul
            WHERE  lseq = #lseq#
        ]]>
    </delete>
</sqlMap>
6.  DAO에서 사용하기 위한 SqlConfig 객체 정의(dbcp+ibatis연결 정보 정의)
import java.io.File;
import java.io.Reader;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.jaeminara.common.log.LogPool;

public class SqlConfig {
    private static SqlMapClient sqlMap = null;
    private static SqlConfig instance_ = null;
  
    private SqlConfig() throws Exception
    {
        Reader reader = null;
        StringBuffer rsc = null;
        try {
            if (sqlMap == null) {
                rsc = new StringBuffer(200);
                rsc.append("com").append(File.separator);
                rsc.append("jaeminara").append(File.separator);
                rsc.append("dwr").append(File.separator);
                rsc.append("app").append(File.separator);
                rsc.append("sql").append(File.separator).append("sqlmap.xml");
             reader = Resources.getResourceAsReader(rsc.toString());
             sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
             reader.close();
            }
        } catch (Exception e) {
            System.out.println(e);
            throw e;
        } finally {
            if (reader != null)
                reader.close();
            reader = null;
            rsc = null;
        }
    }
  
    public static SqlConfig instance()
    {
        try {
            if (instance_ == null) {
                synchronized (SqlConfig.class) {
                    if (instance_ == null)
                        instance_ = new SqlConfig();
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return instance_;
    }

    /**
    * Return SqlMapClient for SDP schema
     *
     * @return
     */
    public static SqlMapClient getSqlMapInstance()
    {
        return sqlMap;
    }
}

7. DAO 클래스 정의
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.mimul.common.log.LogPool;
import com.mimul.dwr.model.getMimulByLSEQ;

public class MimulDao
{
    private SqlMapClient smc =
SqlConfig.instance().getSqlMapInstance();
  
    public void MimulDao() {}
  
    public Mimul getMimulByLSEQ(int lseq) throws Exception
    {
        Mimul mimul = null;

        try {
         if (lseq == 0) {
          LogPool.instance("DAO").debug("getMimulByLSEQ() : Parameter is null!");
          return null;
         }
        mimul = (Mimul) smc.queryForObject("getMimul", lseq);
        } catch (Exception e) {
            LogPool.instance("DAO").error(e);
            throw e;
        }
        return mimul;
    }
    // 기타 필요한 함수 정의
}
크게 어려운 점은 없습니다. 그리고 transaction 무결성을 보장하기 위해서는 executor.startBatch();와 executor.executeBatch(); transaction 처리 로직을 넣으시면 됩니다.
나머진 자동으로 iBatis에서 트랜젝션 자원의 할당 및 해지의 라이프사이클을 관리해 줍니다


728x90
반응형
LIST

'IT > MyBatis' 카테고리의 다른 글

mybatis multiple datasource  (0) 2014.01.17
commit / rollback  (0) 2013.12.24
ibatis like 검색 oracle, ms-sql, mysql  (0) 2013.12.24