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 |