请banq老师回复:getPageIterator与findModelByKey的效率

lunnada 05-08-08

你好,banq老师。我正在学习你的JdonFramework,并试着开发一些小东西。在ModelAction中通常要实现getPageIterator和findModelByKey方法。getPageIterator只是包装了满足搜索条件的数据记录的主键key,而为了获得每一条记录的内容,我要用findModelByKey方法,以key为参数,每次执行newsManager.getNewsType((String) key)。而执行此方法,每次都要执行select * from T_NEWS_TYPE where typeid = ?这句sql语句。
而我们知道,每次执行sql语句的系统开销都是很大的。select * from T_NEWS_TYPE where 搜索条件.... 的效率比执行N句select * from T_NEWS_TYPE where typeid = ? 要高出不知几个数量级。
不知我考虑的对不对,如果是这样,我们该如何提高这个瓶颈呢?
请banq老师回复。谢谢。

banq
2005-08-08 20:31

你的问题很好,主要是这句:
"每次执行newsManager.getNewsType((String) key)。而执行此方法,每次都要执行select * from T_NEWS_TYPE where typeid = ?这句sql语句。"

其实不然,因为Jdon的缓存拦截器缘故,当调用newsManager.getNewsType((String) key)时,实际会激活缓存拦截器,缓存拦截器从缓存中查询NewsType实例,如有从缓存中返回,因此不会每次都会到后台执行SQL语句的,你可以通过日志输出证实一下。

lunnada
2005-08-08 21:46

谢谢banq老师的回答,应该就是指下面的方法了。

//首先从缓存中获取
ModelKey modelKey = new ModelKey(dataKey, modelClass);
model = modelManager.getCache(modelKey);
if (model == null) {
model = fetchModel(request, dataKey);

banq
2005-08-10 21:19

不是,你指出的代码也是一种缓存使用,这样做好处,是降低向后台调用的频率,这种方法只适用一些框架内预定的功能;作为拾遗补阙,在向后台调用时,还将激活缓存拦截器。

为什么不直接暴露缓存拦截器主要是从性能角度考虑。