달력

08

« 2018/08 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
2013.04.01 15:45

Mybatis 설정 I.lib()/I.lib(iBatis)2013.04.01 15:45

.. .. ..

여기서 눈여겨 볼 사항이 <property name="poolPingQuery" value="select 1"/> 이다.

기존에 validationQuery 대신 poolPingQuery로 사용 하고 있다.


다음은 각 pool 과 관련된 속성 값 설명이다.

<property name="poolMaximumActiveConnections" value="20"/>

: 동시 활성화 할 커넥션 수


<property name="poolMaximumIdleConnections" value="20"/>

: 유휴상태의 커넥션 수


<property name="poolMaximumCheckoutTime" value="20000"/>

: 커넥션 요청 후 획득까지 기다리는 시간


<property name="poolPingEnabled" value="true"/>

: 커넥션 ping 테스트


<property name="poolPingQuery" value="select 1"/>

: 커넥션이 살아 있는지 확인할 쿼리


<property name="poolPingConnectionsNotUsedFor" value="43200"/>
: 커넥션이 얼마 동안 유휴상태면 닫히는지 판단하는 시간


<property name="poolTimeToWait" value="30000"/>

: 사용 불가능한 커넥션 기다리는 시간


<property name="poolPingConnectionsOlderThan" value="43200"/>

: 어떤 커넥션이 닫힐 상태인지 판단하는 기준시간

.
Posted by .07274.

댓글을 달아 주세요

.. .. ..

[펌] : http://www.mimul.com/pebble/default/2007/12/09/1197199680000.html

 

 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에서 트랜젝션 자원의 할당 및 해지의 라이프사이클을 관리해 줍니다.

 

.
Posted by .07274.

댓글을 달아 주세요

.. .. ..
BasicDataSource 초기 값

public class BasicDataSource
    implements DataSource
{

    public BasicDataSource()
    {
        defaultAutoCommit = true;
        defaultReadOnly = null;
        defaultTransactionIsolation = -1;
        defaultCatalog = null;
        driverClassName = null;
       maxActive = 8;
       maxIdle = 8;

        minIdle = 0;
        initialSize = 0;
        maxWait = -1L;
        poolPreparedStatements = false;
        maxOpenPreparedStatements = -1;
        testOnBorrow = true;
        testOnReturn = false;
        timeBetweenEvictionRunsMillis = -1L;
        numTestsPerEvictionRun = 3;
        minEvictableIdleTimeMillis = 0x1b7740L;
        testWhileIdle = false;
        password = null;
        url = null;
        username = null;
        validationQuery = null;
        accessToUnderlyingConnectionAllowed = false;
        restartNeeded = false;
        connectionPool = null;
        connectionProperties = new Properties();
        dataSource = null;
        logWriter = new PrintWriter(System.out);
    }


설정

initialSize
초기에 생성되는 커넥션의 갯수

maxActive
커넥션 풀이 제공할 최대 커넥션의 개수

maxIdle
사용되지 않고 풀에 저장될수 있는 최대 커넥션 갯수, 음수일 경우 제한이 없다.

maxWait
풀에 커넥션에 존재하지 않을 때, 커넥션이 다시 풀에 리턴될 때까지 대기시간, 1/1000초 단위, -1일 경우 무한대기

minEvictableIdelTimeMillis
사용되지 않은 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거 안됨, 1/1000초 단위

timeBetweenEvictionRunMillis
사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닌경우 실행 되지 않는다.

numTestsPerEvictionRund
사용되지 않는 커넥션을 몇 개 검사할지 지정

testOnBorrow
true 일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부 검사

testOnReturn
true 일 경우 커넥션 풀에서 커넥션을 반환할 때 커넥션이 유효한지의 여부 검사

testWhileIdel
true 일 경우 비활성화 커넥션을 추출할때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거

poolPreparedStatements
PreparedStatements를 풀링 할것인지 결정한다.

PreparedStatement란 이처럼 바인드 변수의 사용을 가능케 하기 위해 사용됩니다. 따라서 동일한 문장(위처럼 값만 바뀐다거나 할때)이 여러번 연속적으로 실행되거나 비교적연속적(라이브러리 캐쉬에 있는 실행계획이 LRU에 의해 메모리에서 삭제되기 직전에 다시 실행되기만 한다면)으로 실행된다면 월등한 성능향상을 얻을 수 있습니다.
그러므로 꼭 사용하도록 설정한다 ( true로 설정해준다.)
 - 사견으로 이 설정을 해주고 해주지 않은 차이는 약 2.2배의 성능 향상의 차이가 있었다.)
.
Posted by .07274.

댓글을 달아 주세요

  1. Hyo min 2014.01.20 17:47 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다!

2010.04.12 14:59

Ibatis settings 요소 I.lib()/I.lib(iBatis)2010.04.12 14:59

.. .. .. <setting> 요소는 약간의 잡동사니 설정 옵션이다. <settings> 요소에 속성을 추가함으로써 값을 지정할 수 있다. 여러가지 설정들이 있으며 각각은 SQL Maps 인스턴스에 전체적으로 적용된다.

lazyLoadingEnabled
적재 지연 (Lazy Loading)은 정보를 필요할 때만 읽어들이고 다른 데이터는 명시적인 요청이 있을때까지 적재를 미루는 기술이다. 다른 말로 하면 절대적인 요청이 들어올 때까지 애플리케이션이 가능한 한 일을 적게 하는 것이다.

1000명의 고객 계좌가 각각 1000개의 주문을 가지고 있고 각 주문은 25개의 항목을 가졌다. 이 모든 데이터를 읽어 들이려면 25,000,000개의 객체를 생성하고 그것들을 메모리에서 유지해야 할 필요가 생긴다. 적재 지연을 사용하면 요구 사항을 거의 2500개로 줄일수 있으며 이는 원래 개수의 일만분의 1이다.
이 설정은 연관된 쿼리 구문이 있을때 적재 지연을 사용할지 여부를 지정하는 데 쓰인다. 사용 가능한 값은 'True' 혹은 'False'이며 디폴트 값은 'True'이다.

cacheModelsEnabled
캐싱은 성능을 향상시키는 기법으로 최근 사용된 데이터가 미래에 다시 사용될 것이라 가정하고 메모리에 계속 저장해 두는 것이다. 이 설정은 iBatis가 캐싱을 사용할지 여부를 지정하는데 사용한다.
디폴트 값은 'True'이며 캐싱의 이점을 누리려면 매핑 구문에 캐시 모델도 설정해야만 한다.

enhancementEnabled
이 설정은 CGLIB에 최적화된 클래스를 통해 적재 지연 성능을 향상시킬지 여부를 지정하는 데 사용한다. 마찬가지로 사용 가능한 값은 'True' 와 'False' 이고 디폴드 값은 'True' 이다.
[참고]
CGLIB는 실행 시간에 코드를 생성하는 라이브러리이다. 이는 iBatis의 자바빈즈 속성 설정과 같은 특정 기능을 최적화시켜준다. 또한 구상 클래스의 적재 지연도 지원하여 적재 지연이 필요한 형에 대해 인터페이스를 생성해야만 하는 현상을 피하게 해준다. CGLIB는 http://cglib.sourceforge.net에서 구할수 있다. 다른 형성 향상 기법들처럼 꼭 필요하다고 생각되지 않으면 사용하지 않는 것이 좋다.
위의 예제에서는 enhancement 를 활성화 하였다. 하지만 cglib가 클래스 패스상에 없으면 이 기능은 조용히 비활성화 될 것이다.


useStatementNamespace
이 설정은 매핑 구문이 적절한 이름을 가지고 있어야 iBatis가 실행될수 있도록 하는 옵션이다. 사용가능한 값은 'true' 혹은 'false'이며 디폴트 값은 'false'이다.
다시 말해 SQL Map을 정의할 때 적절한 맵 이름을 가진 매핑 구문을 선택하는 데 사용된다는 것이다. 예를 들어 'Account'라는 이름을 가진 SQL mAP 이 있고 이 맵은 'insert', 'update' ,'delete', 'getAll' 이라는 이림의 매핑 구문을 포함하고 있다고 가정하자. 계좌(Account) 하나를 추가하고자 한다면, 'Account.insert'라는 매핑 구문을 호출하면 되는 것이다. 이로써 서로 다른 맵에 원하는 대로 여러 'insert' 라는 매핑 구문을 작성해도 이름이 충돌하지 않게 된다.
비록 'insertAccount'와 같은 이름을 이용해서 동일한 결과를 얻을 수도 있지만 명명공간(name space)를 사용하면 대규모 시스템에서 작업하는 데 도움이 많이 된다. 이는 쿼리 구문들이 논리적으로 조직화되어 있지 않은 경우, 구문을 찾는데 도움을 주기 때문이다.

maxRequest (비권장)
요청이란 입력,수정,삭제 그리고 저장 프로시저 호출과 같은 모든 SQL 작업을 의미한다. 디폴트 값인 512 대신에 최대 32개의 요청만이 한 번에 수행될 수 있도록 최대 요청 개수를 축소하였다.

maxSessions (비권장)
세션이란 스레드 차원의 메커니즘으로, 관련되어 있는 트랜잭션과 요청의 묶음에 대한 정보를 추적하는 데 사용한다. 위 예에서는 한 번에 10 개의 세션만이 가능하도록 하였으며, 디폴트 값은 128개이다.


maxTransactions (비권장)
트랜잭션이란 말 그대로 데이터베이스 트랜잭션을 의미한다. maxRequest(위에 나옴)와 같이 디폴트 값인 32 대신 활성 트랜잭션 개수를 5로 줄인다.
[참고]
이 설정들은 이해하기 어려운 편인데 다행이도 이것들의 사용을 권장하지 않는 것들이다. 앞으로 출시 될 iBatis 에서는 이들의 수동으로 설정할 필요가 없어질 것이다. 그러므로 대부분의 경우 이를 수정하지 말고 그냥 놔두면 된다. 기본 설정은 적젉한 규모의 대부분의 시스템에서 잘 작동한다. 만약 이를 꼭 수정해야 한다면 항상 maxRequest 값이 maxSession 값보다 크고, maxSession 값이 maxTransactions 값도다 커야 함을 명심하라. 일반적으로 단순히 이 값들을 동일하게 유지하는 것이 좋다고들 한다. 또 이 설정들 중 어느 것도 직접적으로 커넥션 풀의 커넥션 개수나 혹은 애플리케이션 서버가 관리를 책임지고 있는 자원에 대해 영향을 미치지 않는다.
.
Posted by .07274.

댓글을 달아 주세요

  1. Favicon of http://7354.morningcallcoffeesstand.com/ChicagoBlackhawks-us.php BlogIcon Chicago Blackhawks Jersey 2013.07.24 05:37 신고  댓글주소  수정/삭제  댓글쓰기

    다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

.. .. ..

null처리 방식이 여러방법이있겠지만   아이바티스로만 알려드리겠습니다.(다른방법은.... DTO에서 처리 또는

인설트 하는 jsp아님 struts면 액션클래스에서 처리를 해주셔야겠지요...)

 

<sqlMap>
 
 <typeAlias alias="login" type="example.chapter10.login.loginVO" />

<resultMap id="loRes" class="login">
   <result property="id" column="id" nullValue="" />
  </resultMap>

  <sql id="jungbok">
   select id from login
  </sql>
  
  <select id="jungbokId"  resultMap="loRes">
   <include refid="jungbok"/>
    where id = #id#
  </select>

</sqlMap>

 이부분에서  resultMap에서 nullValue="" 설정해주시구요.... 말그대로 리턴될 resultMap에서 nullValue는 영어 그대로 null값입니다. 더쉽게 말해서 이 필드가 리턴될때 null값이면 nullValue에 있는 값으로 대체한다는거지요.....

 또한 DB table을 작성할시 예로..

<insert id="boardinsert" parameterClass="tempClass">
        insert into test(num,name) values(test_SEQ_num.nextval,#name:VARCHAR:NO_ENTRY#)

</insert>

 이경우는 test테이블에 추가를한다고 가정하면  위에 빨강색 글씨로 된부분처럼 #name:VARCHAR:NO_ENTRY# 이렇게 써주면 null처리가 됩니다. 당연.... 테이블 작성시 name필드는

null이 허용이 되게 만들어야겠지요...

 

 마지막으로 여담인데.... sitemesh를 이용하시는거 같아요 즉 struts2 sitemesh플러그인를 사용하시는건가봐요??? 1,2년전부터 sitemesh를 많이 사용한다고 하지만... 최근 tile2가 인기가 급상승 되었다고 합니다. 저도 써본결과 sitemesh는 사용하기는 쉽고 편하지만.. 부하가 많이 걸리고 tile2보다는 재사용성에서 떨어져서 그런거 같습니다. 공부하는 사람이라면 tiles2도 함께 알아두시면 좋을것 같습니다...tiles2도 Layout꾸며서 활용하는거에서는 개념이 같습니다......

.
Posted by .07274.

댓글을 달아 주세요

2010.02.24 21:21

iBatis 강의 자료. I.lib()/I.lib(iBatis)2010.02.24 21:21

.. .. .. 김하영씨것은 강의자료

2번째 파일은 iBatis 개발자 가이드.
.
Posted by .07274.

댓글을 달아 주세요