首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

浅析ibatis的cache兑现

2012-07-08 
浅析ibatis的cache实现ibatis提供四种缓存方案,LRU、FIFO、MEMORY、EHCACHE,通过定义不同的cacheModel,将数据

浅析ibatis的cache实现
ibatis提供四种缓存方案,LRU、FIFO、MEMORY、EHCACHE,通过定义不同的cacheModel,将数据缓存在cache中。

具体写法参考如下



一、参见com.ibatis.sqlmap.engine.builder.xml.SqlMapParser

    CacheKey cacheKey = getCacheKey(request, parameterObject);    cacheKey.update("executeQueryForObject");    Object object = cacheModel.getObject(cacheKey);    if (object == CacheModel.NULL_OBJECT){    //This was cached, but null    object = null;    }else if (object == null) {       object = statement.executeQueryForObject(request, trans, parameterObject, resultObject);       cacheModel.putObject(cacheKey, object);    }    return object;

如果没从cacheModel中获取到缓存数据,则继续查询,并将查询结果放到缓存中。
从这里的代码也能看到,cacheModel是允许存在缓存对象为null的情况,因此如果查询结果为null,也会缓存起来,这里要稍加注意。

四、参加com.ibatis.sqlmap.engine.cache.CacheModel
cacheModel.getObject(cacheKey)的方法,由cacheMode定义的cacheController实现(LRU、FIFO、MEMORY、EHCACHE),cacheModel作为单例类的成员变量,可以全局共享,同样CacheController做为cacheModel的成员变量,也可以全局共享,这样CacheController持有的Map cache和List keyList,也在cacheModel可以控制的范围内全局共享了,这样就实现了缓存的效果。
这里有个有意思的地方,由于cacheModel在getObject的时候,会自动统计request和hit的次数,因此使用缓存的方式,cacheModel可以提供输出缓存命中率的方法 -- 参见 public double getHitRatio()

热点排行