본문 바로가기

programming/ibatis/mybatis

ibatis caching

cacheModel


1
2
3
4
5
6
7
<cacheModel id="product-cache" type="LRU" readOnly="true" serialize="false">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertProduct"/>
    <flushOnExecute statement="updateProduct"/>
    <flushOnExecute statement="deleteProduct"/>
    <property name="cache-size" value="1000"/>
</cacheModel>


위의 캐쉬 모델은 LRU(Least Recently Used) 방식을 사용해서 "product-cache"라는 이름의 캐쉬 인스턴스를 생성.

type속성값은 전체경로의 클래스명이거나 아래처럼 구현을 포함하는 것의 별칭.

flush요소에 기초하여 캐쉬모델 내에서 정의됨. 이 캐쉬는 24시간마다 삭제됨. interval요소내에서 hours, minutes, seconds

또는 milliseconds단위로 설정이 되어서 삭제됨. 캐쉬는 추가적으로 insertProduct, updateProduct, 또는 deleteProduct 

맵핑 statement가 수행될때마다 삭제됨. 캐쉬를 위해 "flush on execute" 요소의 숫자값이 적용될수 있음.

몇몇 캐쉬 구현물은 위에서 보여지는  'cache-size' 같은 추가적인 프로퍼티를 필요로함. LRU 캐쉬의 경우에 크기는 캐쉬내

저장되기 위한 항목의 갯수로 결정됨. 캐쉬 모델이 설정되었을때 맵핑된 statement에 의해 사용되기 위한 캐쉬모델을

정의 할 수 있음. 예를 들면

1
2
3
<statement id="getProductList" cacheModel="product-cache">
    select * from PRODUCT where PRD_CAT_ID=#value#
</statement>

- 읽기전용 & 읽기/쓰기

프레임워크는 읽기전용과 읽기/쓰기 캐쉬를 모두 지원함.

읽기전용 캐쉬는 모든 유저에 의해 공유되어서 좀 더 큰 성능향상을 보여줌. 어쨋든 읽기전용 캐쉬로부터 읽어들인 객체는

변경불가능. 대신 새로운 객체는 업데이트를 위해 데이터베이스(또는 읽기/쓰기 캐쉬)로부터 읽어야만 함.

반면에 정정(retrieval)및 변경을 위한 객체를 사용할 경우에는 읽기/쓰기 캐쉬가 추천됨.(이를테면 필수임)

읽기전용 캐쉬를 사용하기 위해서는 캐쉬모델요소에 readOnly="true"를 셋팅. 기초설정값은 읽기전용(true)임.


-직렬화 가능한 읽기/쓰기 캐쉬

당신이 동의한다면 서술된 것처럼 세션당 캐쉬는 전역 애플리케이션 성능에 이익을 줌. 읽기/쓰기 캐쉬의 다른 타입은

전체 애플리케이션이 직렬화가능한 읽기/쓰기 캐쉬라면 성능향상을 보여줌. 이 캐쉬는 각각의 세션에 캐쉬된 객체의 다른

인스턴스를 반환할 것임. 그러므로 각각의 세션은 안전하게 반환된 인스턴스를 변경할 수 있음. 여기서 의미론적인 차이점을

알아보자면 당신은 언제나 캐쉬로부터 반환된 같은 인스턴스를 기대하겠지만 캐쉬내에서 당신은 다른것을 얻게될것임.

또한 직렬화 가능한 캐쉬로부터 저장된 모든 객체는 직렬화 가능해야만 함. 이것은 직렬화 가능한 캐쉬로 조합된 늦은(lazy)

로딩기능을 사용하기에는 어려울것이라는 것을 의미함. 왜냐하면 늦은(lazy) 프록시는 직렬화 가능하지 않기 때문임.

캐쉬의 조합을 해결하는 가장 좋은 방법은 늦은(lazy)로딩과 테이블 조인을 간단히 시도하는것임.

직렬화 가능한 캐쉬를 사용하기 위해서는 기초설정 캐쉬모델이 읽기전용이고 직렬화 가능하지 않기때문에 readOnly="true" 와

serialize="true"로 셋팅하라. 읽기전용 캐쉬는 직렬화되지 않을 것임.


-캐쉬타입들

캐쉬 모델은 다른 타입의 캐쉬를 지원하기 위해서 플러그인 형태의 프레임워크를 사용한다. 그 구현은 cacheModel요소의

type 속성값내에 정의됨. 이 정의된 클래스 이름은 CacheController인터페이스의 구현이나 아래에서 논의되는 4가지 별칭중

하나가 되야만함. 게다가 설정 파라미터는 cacheModel내에 포함된 property요소를 통해 구현체로 전달될수 있음.

현재 배포판에는 4가지 구현물을 포함하고 있음.

- MEMORY (com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)

- LRU (com.ibatis.db.sqlmap.cache.lru.LruCacheController)

- FIFO (com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)

- OSCACHE (com.ibatis.db.sqlmap.cache.oscache.OSCacheController)


캐쉬타입들에 대한 자세한 설명은 ibatis guide 참고.


iBATIS-SqlMaps-2_ko.pdf



- iBATIS SQL Maps 개발자 가이드 Version 2.0 발췌