二級緩存是多個session間的數據共享
1. 修改SqlMapConfig.xml配置文件
~~~
<settings>
<!-- 開啟二級緩存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
~~~
2. 修改mapper映射文件
~~~
2. Mapper.xml
<cache></cache>
~~~
3. 對象必須實現Serializable接口
4. 測試樣例
~~~
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession sqlSession2 = sqlSessionFactory.openSession();
SuserMapper suserMapper = sqlSession.getMapper(SuserMapper.class);
SuserMapper suserMapper2 = sqlSession2.getMapper(SuserMapper.class);
suserMapper.getAllUsers();//發送SQL語句
suserMapper2.getAllUsers();//不發送SQL語句
sqlSession.commit();//必須commit, 其他session才能共享數據
suserMapper2.getAllUsers();//不發送SQL語句
~~~
useCache 配置
在 statement 中設置 useCache=false 可以禁用當前 select 語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。
~~~
<select id="findUserById" parameterType="int" resultType="user" useCache="false">
~~~
總結:針對每次查詢都需要最新的數據sql,要設置成useCache=false,禁用二級緩存。
刷新緩存(清空緩存)
在mapper的同一個namespace中,如果有其它insert、update、delete操作數據后需要刷新緩存,如果不執行刷新緩存會出現臟讀。
設置statement配置中的flushCache=”true” 屬性,默認情況下為true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現臟讀。
如下:
~~~
<insert id="insetrUser" parameterType="cn.zhisheng.mybatis.po.User" flushCache="true">
~~~
一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數據庫臟讀。