dropkai 2011-09-21
iBATIS可以在MappedStatement中使用缓存模型,在内存中缓存常用的数据。属性cacheModel定义查询mappedstatement的缓存。每一个查询mappedstatement可以使用不同或相同的cacheModel。以下给出个例子:
<cacheModel id="product-cache" imlementation="LRU"> <flushInterval hours="24"/> <flushOnExecute statement="insertProduct"/> <flushOnExecute statement="updateProduct"/> <flushOnExecute statement="deleteProduct"/> <property name="size" value="1000" /> </cacheModel> <statement id="getProductList" parameterClass="int" cacheModel="product-cache"> select * from PRODUCT where PRD_CAT_ID = #value# </statement>
上面例子中,“getProductList”的缓存使用WEAK引用类型,每24小时刷新一次,或当更新的操作发生时刷新。
CacheModel使用插件方式来支持不同的缓存算法。它的实现在cacheModel的用type属性来指定(如上所示)。指定的实现类必须实现CacheController接口,或是下面4个别名中的其中之一。CacheModel实现的其他配置参数通过cacheModel的property元素来设置。目前包括以下的4个实现:
"MEMORY”(com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)。MEMORYcache实现使用reference类型来管理cache的行为。垃圾收集器可以根据reference类型判断是否要回收cache中的数据。MEMORY实现适用于没有统一的对象重用模式的应用,或内存不足的应用。
“LRU”(com.ibatis.db.sqlmap.cache.lru.LruCacheController)。LRUCache实现用“近期最少使用”原则来确定如何从Cache中清除对象。当Cache溢出时,最近最少使用的对象将被从Cache中清除。使用这种方法,如果一个特定的对象总是被使用,它将保留在Cache中,而且被清除的可能性最小。对于在较长的期间内,某些用户经常使用某些特定对象的情况(例如,在PaginatedList和常用的查询关键字结果集中翻页),LRUCache是一个不错的选择。
“FIFO”(com.ibatis.db.sqlmap.cache.fifo.FifoCacheController)。FIFOCache实现用“先进先出”原则来确定如何从Cache中清除对象。当Cache溢出时,最先进入Cache的对象将从Cache中清除。对于短时间内持续引用特定的查询而后很可能不再使用的情况,FIFOCache是很好的选择。
“OSCACHE”(com.ibatis.db.sqlmap.cache.oscache.OSCacheController)。OSCACHECache实现是OSCache2.0缓存引擎的一个Plugin。它具有高度的可配置性,分布式,高度的灵活性。
如:对于sql语句order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"。