Search

'ibatis'에 해당되는 글 3건

  1. 2012.04.18 iBatis Cache 모델
  2. 2012.04.18 iBatis RowHandler
  3. 2012.04.18 iBatis ResultMap 상속

iBatis Cache 모델

Java/iBatis 2012. 4. 18. 11:35 Posted by 퓨어레드

iBatis Cache 모델

-       개발팀 남한희 대리

1.     캐쉬를 왜 사용 하는가

A.     캐쉬를 사용함으로써 중복 쿼리의 속도를 향상시킴

B.      캐쉬를 사용하여 Database 부하를 줄임

 

2.     iBatis 에 캐쉬모델

A.     iBatis 에서의 캐쉬모델은 데이터베이스를 이용하지 않고 읽어들인 쿼리 결과를 메모리에 저장하고 같은 요청이 왔을 때 리턴하는 방식이므로 데이터베이스와 상관없이 동작한다.

B.      그렇다면 캐쉬 모델을 비우는 시점은 어떻게 결정될까?
iBatis
에서는 캐쉬 모델을 비우는 방법을 두가지 설정 할 수 있다.

                         i.         특정 statement 가 실행 될 때..

                        ii.         특정 시간이 초과 되면

                       iii.         특정 사이즈를 초과 하면 (메모리 모델에 따라 결정)

 

3.     캐시 모델 타입의 종류

A.     MEMORY : Heap 메모리에 저장하는 구조

                         i.         캐쉬 데이터가 GC 에게 삭제되는 형태를 결정 할 수 있다.

1.      WEAK : GC 가 메모리 반환이 필요하면 바로 캐쉬 데이터는 삭제된다.

2.      SOFT : GC 에서 메모리가 없어서 반환 요청을 할 때 캐쉬 데이터를 삭제한다.

3.      STRONG : Statement 와 캐쉬 비우는 시간이 되지 않는 이상 GC 에 반환하지 않는다.

B.      LRU : 사용하지 않는 오래된 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

C.      FIFO : 가장 먼저 만들어진 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

D.     OSCACHE : Open Symphoy 라는 캐쉬 프레임워크를 사용 하여 캐시를 관리한다.

 

4.     캐시 데이터 처리 방법의 종류

A.     readOnly : 읽기 전용이면 공유 메모리를 리턴한다.

                         i.         False : 읽기 전용이 아니기 때문에 데이터 사용은 복사를 하여야 한다.

B.      serialize : 객체 복사 여부 결정

                         i.         True : 객체를 복사하여 리턴한다.

                        ii.         False : 객체를 복사하지 않고 캐시된 객체 자체를 리턴한다.

C.      readOnly serialize 를 적절히 조합해야 한다.

                         i.         readOnly : true, serialize : false -> 읽기 전용에 객체 자체를 리턴하기 때문에 가장 빠름

                        ii.         readOnly : false, serialize : true ->
객체가 복사되어 리턴하고 리턴된 객체는 쓰기를 할 수 있다.

                       iii.         readOnly : true, serialize : true ->
의미가 없다.

                       iv.         readOnly : false, serialize : false ->
공유된 객체이므로 상당히 위험하다


 

 

 

5.     문법

A.     캐쉬 모델 선언

                         i.         <cacheModel id = “캐시아이디” type=”캐시모델타입” readOnly=”true” serialize=”false”>

</cacheModel>

-
기본 적인 캐시모델 선언이다
.

B.      캐시 적용

                         i.         <select id = “selectCategorys” parameterClass=”int” resultClass=”CategoryVo”
cacheModel=”
캐시아이디
”>
</select>

-
캐쉬가 적용되어 같은 요청이 오면 캐쉬에서 데이터가 나간다
.

C.      Flush 적용

                         i.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
</cacheModel>

- insert, update, delete
등이 호출되면 캐쉬가 초기화 된다.

                        ii.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushInterval hours=”12” />
</cacheModel>

- 12
시간 마다 캐시를 삭제한다. (hours, minutes, seconds, milliseconds 사용 가능
)


D.     모델 타입 적용

                         i.         MEMORY

1.      메모리는 property 값을 reference-type 을 받는다.

2.      <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “reference-type” value = “WEAK” />
</cacheModel>


 

 

                        ii.         LRU

1.      LRU 는 프로퍼티로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”LRU” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

                       iii.         FIFO

1.      FIFO LRU 와 마찬가지로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”FIFO” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
<property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

 

6.     캐시 전략 수립하기

A.     여러 종류의 캐시 레벨이 존재하기 때문에 데이터의 형태에 따라 적절한 캐시 모델을 사용한다.


7.     캐시 모델 직접 제작하기

A.     Com.ibatis.sqlmap.engine.cache.CacheController 인터페이스를 구현하면 자신만의 캐시 엔진을 만들수 있다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis RowHandler  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis RowHandler

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis RowHandler

-       개발팀 남한희 대리

1.     iBatis RowHandler ..

A.     용량 또는 레코드 수가 많은 레코드셋을 처리할수 있는 방법

B.      레코드를 한번에 다 가져오지 않고 레코드 하나하나씩을 핸들러에서 처리하는 방식

C.      iBatis 특성상 Recordset 을 모두 List 에 저장해야 되는 단점을 극복할수 있는 방법

D.     List 에 전부 저장하지 않고 바로바로 처리 하여 메모리를 절약할수 있고 실행 속도 또한 절약 할 수 있다.

 

 

2.     핸들러 만들기

A.     핸들러 클래스는 com.ibatis.sqlmap.client.event.RowHandler 를 구현해야 한다.

B.      RowHandler 인터페이스의 void handleRow (Object valueObject) 를 구현한다.

C.      handleRow 에 넘어오는 valueObject ResultMap 에 해당하는 Class 가 리턴한다.
해당 클래스로 캐스팅하여 데이터를 처리한다.

D.     핸들러 클래스는 생성을 하여 iBatis 에 넘기는 구조이기 때문에 다른 여러 부가적인 처리가 가능하다.


 

3.     핸들러 호출

A.     핸들러 클래스를 생성한 다음 sqlMapClient 함수중 queryWithRowHandler 를 호출한다.

B.      queryWithRowHandler ([Select ID], [Parameter Data], [RowHandler Interface]);

C.      로우 핸들러는 당연히 Select ID 에만 매칭이 된다.

D.     queryWithRowHandler ("res.getsResource", sData, rowHandler);

 

 

4.     스프링에서의 호출

A.     스프링의 getSqlMapClientTemplete () 에는 해당 함수가 없다.

B.      그러기에 getSqlMapClient () 를 호출하여 직접 sqlMapClient 에 접근하여 호출한다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis ResultMap 상속

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis ResultMap 상속

-       개발팀 남한희 대리

1.     상속과 구성의 차이점을 명확하게 알자!!

A.     상속은 상위를 포함한 하위 확장 개념

B.      구성은 상위를 내포한 포함 개념 (말이 이상하다 따로 설명해야 할 듯..)


2.     ResultMap 상속의 개념

A.     ResultMap 을 상속하는 개념은 비슷한 기존 ResultMap 에서 확장된 ResultMap 이 있을 경우,  코드량을 줄이고 기존 ResultMap 에서 확장된 ResultMap 을 사용 할 경우 사용함


3.     예시

A.     코멘트, 첨부파일, 도메인 모델 등에서 사용

                         i.         코멘트 : 코멘트의 경우 보통 일련번호, 작성자, 내용 등 많은 내용이 비슷하고 이에 FK만 달라지는 경우가 많다. 이럴 경우 공통 ResultMap 에 들어가는 필드는 테이블에 맞춰주고 달라지는 부분만 상속으로 처리한다. (첨부파일도 마찬가지)

                        ii.         도메인 모델 : 기본 ResultMap 을 만들고 추가되는 Domain 모델이 있다면 이 항목을 기본 ResultMap 을 상속받고 추가되는 Domain 모델을 확장하여 ResultMap 을 구성한다.
도메인 모델에선 상속된 ResultMap 으로 데이터를 주입받아 속도 개선에 도움을 준다
.


4.     문법

A.     상속 받는 ResultMap extends=”상위ResultMapID”

B.      기본 ResultMap
<resultMap class="ResellerVo" id="ResellerRm">
<
result property="resellerID" column="resellerID" jdbcType="VARCHAR" />
</resultMap>

C.      ResultMap 상속
<resultMap class="ResellerDm" id="ResellerDmRm" extends="ResellerRm">
<
result property="companys" column="{resellerID=resellerID}" select="company.getsGwCompany" />
</resultMap>

D.     기타

                         i.         하위 ResultMap  에 들어가는 Vo Class 가 상위 ResultMap 에 들어가는 Vo Class 와 꼭 상속 관계일 필요는 없다. (ResultMap 에서만 상속관계이지 실제 클래스가 상속관계일 필요는 없다는 것)


 

 

iBatis 하위 ResultMap 결정

 

5.     선택 가능한 하위 ResultMap

A.     특정 조건으로 하위 ResultMap 을 결정 할수도 있다.

B.      조건은 상위 ResultMap 에서 결정한다.

C.      특정 컬럼의 값으로 하위 ResultMap 을 결정한다.

6.     문법

A.     <resultMap class="ResellerVo" id="ResellerRm">
<result property="resellerID" column="resellerID" jdbcType="VARCHAR" />         
<result property="resellerName" column="resellerName" jdbcType="VARCHAR" />
<result property="regDate" column="regDate" jdbcType="VARCHAR" />

<discriminator column="TYPE" javaType="string">
<subMap value="Book" resultMap="ResellerRm2" />
<subMap value="News" resultMap="ResellerRm3" />
</discriminator>


</resultMap>

B.      Select 가 된 컬럼중 TYPE 이라는 컬럼의 값이 Book 이면 ResellerRm2 을 선택하고
News
라면 ResellerRm3 를 선택함


C.      하위 Resultmap 을 결정 구분을 사용 할 경우 구분 할 수 있는 컬럼이 있어야 한다.

D.     만약 구분 할 수 있는 컬럼이 없다면 alias 를 이용한다.

                         i.         Select field1, field2, field3, ‘Book’ as TYPE FROM TestTable

 

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis RowHandler  (0) 2012.04.18