MyBatis二級緩存

Mybatis默認是不開啓二級緩存的,相對於同一個sqlsession而言只開啓一級緩存,所以在參數和sql完全相同的情況下,我們使用同一個sqlSession調用同一個mapper方法,只會執行一次sql查詢

一:下面是一級緩存的實例,一級緩存是在sqlSession層面的

sqlSession=SqlSessionFactotyUtil.openSqlSession();
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
        <!--第一次使用-->
            List<Role> roles=roleMapper.findRoleByMap("d","9");
            for (Role role2 : roles) {
                System.out.println("符合條件的結果爲"+role2.getId());
            }
        <!--第二次使用-->
            List<Role> roles3=roleMapper.findRoleByMap("d","9");
            for (Role role2 : roles3) {
                System.out.println("符合條件的結果爲"+role2.getId());
            }
            sqlSession.commit();

查詢的結果如下

<!--第一次結果-->
==>  Preparing: select id,roleName as roleName, note from role where roleName like concat('%',?,'%') and note like concat('%',?,'%') 
==> Parameters: d(String), 9(String)
<==      Total: 2
符合條件的結果爲3
符合條件的結果爲5

<!--第二次結果-->
符合條件的結果爲3
符合條件的結果爲5

二級緩存是針對SqlSessionFactory的,不會在各種sqlSession之間隔離

開啓二級緩存
1.需要在xml影射中加入

    <cache></cache>這樣設置都是默認的
    <cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true" />s
    flushInterval刷新間隔時間,100s
    size 最大緩存的對象數量,不事宜過大,會導致內存溢出
    readOnly 該爲true之後,數據只能讀取不能修改,這樣可以快速讀取緩存。默認爲false
    eviction 緩存策略 lru爲最長時間不使用

還可以自定義緩存,就不介紹了
2.影射的實體類中要實現Serializable接口

@Alias("role")
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String roleName;
    private String note;

下面看實例代碼

sqlSession=SqlSessionFactotyUtil.openSqlSession();
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
        <!--第一次使用-->
            List<Role> roles=roleMapper.findRoleByMap("d","9");
            for (Role role2 : roles) {
                System.out.println("符合條件的結果爲"+role2.getId());
            }
        <!--第二次使用-->
            List<Role> roles3=roleMapper.findRoleByMap("d","9");
            for (Role role2 : roles3) {
                System.out.println("符合條件的結果爲"+role2.getId());
            }
            sqlSession.commit();
        <!-- 更換sqlsession之後-->
            System.out.println("------------------------------");
            sqlSession2=SqlSessionFactotyUtil.openSqlSession();
            RoleMapper roleMapper2=sqlSession2.getMapper(RoleMapper.class);
            List<Role> roles2=roleMapper2.findRoleByMap("d","9");
            for (Role role3 : roles2) {
                System.out.println("符合條件的結果爲"+role3.getId());
            }
            sqlSession2.commit();

開啓二級緩存之後結果如下

Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.0
==>  Preparing: select id,roleName as roleName, note from role where roleName like concat('%',?,'%') and note like concat('%',?,'%') 
==> Parameters: d(String), 9(String)
<==      Total: 2
符合條件的結果爲3
符合條件的結果爲5
Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.0
符合條件的結果爲3
符合條件的結果爲5
------------------------------
Cache Hit Ratio [com.learn.chapter2.mapper.RoleMapper]: 0.3333333333333333
符合條件的結果爲3
符合條件的結果爲5

可以從結果看出,就算更換了sqlsession之後,也總共執行了一次sql查詢。

發佈了28 篇原創文章 · 獲贊 17 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章