1. 程式人生 > >ibatis 一級快取和二級快取 遇到的問題,更新後查詢問題

ibatis 一級快取和二級快取 遇到的問題,更新後查詢問題

最近碰到同事使用ibatis 和spring mvc,遇到了 update 後查詢 結果為未update前的資料,但是事物整體操作結束後資料是成功update了。最初懷疑是spring的事物傳播問題,以為是本類呼叫本類方法導致的.但是看了一下應用log,整體的sqlsession 的記憶體物件,連結是一個物件而且開啟了事物,似乎事物傳播沒問題。又仔細看看了日誌,發現查詢ibatis只有第一次查詢和update時是列印sql的,但是第二次查詢沒有列印sql,於是懷疑快取的問題。但是看到ibatis xml 配置裡 cache是禁用的,仔細查了下資料。原來ibatis是兩級快取,

第一級快取只能是開啟的,而且是每個sqlsession 內部的,可以在每個sql級別配置 是否啟用或者清除,這正是導致第二次查詢的結果是未更新的原因,因為直接查的記憶體中資料

1:localCache

<select id="cleanCache" resultType="long" useCache="false" flushCache="true">              select 1 from dual               </select>  執行這個sql 可以清除cache
2.第二級快取是全域性的,通過xml中配置<cache/> 生效


有的人遇到此問題在禁用二級快取的情況下,可能會使用手動執行一下cleanCache的sql,但實際上這個不是根本,更本的原因是,他們在寫mapper.xml時 在做 insert,update,delete操作 使用的是 select 標籤。這個select 標籤在執行時是不清除一級和二級快取的,只有insert,update,delete標籤 執行時會自動清除一級和二級快取。

關鍵入口類 :org.apache.ibatis.session.defaults.DefaultSqlSession
org.apache.ibatis.executor.BaseExecutor,CachingExecutor