最近遇到个小问题,就是在做项目时,对数据更新后,每次都不能通过查询语句显示到最新的数据,经过反复的测试,发现查询,保存,更改相关的sql语句或方法都没有错误,更让人无语的是,每次重启服务后,上次更新的数据就能正常显示了,而再进行更新操作时,有会出现问题,感觉应该是缓存问题。说明下,本人项目所用的框架是springMVC+ibatis,上网查了下,感觉可能与ibatis一个设置cachemodel有关,就专门了解了下,然后对照自己的ibatis配置文件,终于找出了问题所在相关代码如下 :
<cacheModel type="MEMORY" id="cacheXtsz"> <flushOnExecute statement="HIS_XT_XTSZ_NEW.newXt_xtsz_new"/> <flushOnExecute statement="HIS_XT_XTSZ_NEW.editXt_xtsz_new"/> <flushOnExecute statement="HIS_XT_XTSZ_NEW.delXt_xtsz_new"/> <flushOnExecute statement="HIS_XT_XTSZ_NEW.editXt_xtsz_newforUpLoad"/> <property name="reference-type" value="WEAK"/> </cacheModel>
这是我的原配置文件,其中查询时用到:<select id="queryXt_xtsz_new" parameterClass="java.util.Map" resultMap="xt_xtsz_newMap" cacheModel="cacheXtsz"> Select * From ( SELECT rownum as rowIndex, t.* FROM xt_xtsz_new t <include refid="xt_xtsz_newsql"/> order by xtszid ) <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="start"> rowIndex BETWEEN #start# AND #end# </isNotNull> </dynamic> </select>
我发现在cacheModel配置中少了flushInterval这个,经网上了解到,这个是自动刷新缓存,少了这个意义上就是不能自动刷新了,所以,当数据更改时,再去查询,实际上一直查到的是缓存中的数据,所以导致你的数据库中数据已经更新,但页面上却显示的和数据库的不一致,这个如果发现不了,很让人头疼。所以我给添加上了,如下
<cacheModel type="MEMORY" id="cacheXtsz">
<flushOnExecute statement="HIS_XT_XTSZ_NEW.newXt_xtsz_new"/>
<flushOnExecute statement="HIS_XT_XTSZ_NEW.editXt_xtsz_new"/>
<flushOnExecute statement="HIS_XT_XTSZ_NEW.delXt_xtsz_new"/>
<flushOnExecute statement="HIS_XT_XTSZ_NEW.editXt_xtsz_newforUpLoad"/>
<flushInterval seconds="2"/> <!--添加-->
<property name="reference-type" value="WEAK"/>
</cacheModel>这样结果就正常了