读书人

浅析ibatis的cache兑现

发布时间: 2012-07-08 17:43:44 作者: rapoo

浅析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()

读书人网 >开源软件

热点推荐