免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
mysql緩存:一級緩存和二級緩存

一級緩存:

  也稱本地緩存,sqlSession級別的緩存。一級緩存是一直開啟的;與數(shù)據(jù)庫同一次回話期間查詢到的數(shù)據(jù)會放在本地緩存中。

  如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,不會再查數(shù)據(jù)庫。

  一級緩存失效的四種情況:

    1.sqlSession不同。

      eg:

1
2
3
@Test
    public void test01() throws IOException {
        SqlSessionFactory sqlSessionFactry = getSqlSessionFactory(); <br>          SqlSession session = sqlSessionFactory.openSession();<br>          EmployeeMapper mapper = session.getMapper(EmployeeMapper.class); <br>          try { Employee map = mapper.getEmployeeById(1);<br>             Employee map2 = mapper.getEmployeeById(1);<br>          System.out.println(map == map2);<br>                session.commit(); <br>               } <br>               finally { session.close(); } <br>        } <br>輸出結(jié)果為true 數(shù)據(jù)庫只查詢一次,map2取緩存結(jié)果

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
    public void test01() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
         SqlSession session = sqlSessionFactory.openSession();
                 SqlSession session2 = sqlSessionFactory.openSession();
         EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
                 EmployeeMapper mapper2 = session.getMapper(EmployeeMapper.class);
         try {
             Employee map  = mapper.getEmployeeById(1);
                         Employee map2  = mapper.getEmployeeById(1);
             System.out.println(map == map2);
             session.commit();
            } finally {
                session.close();
            }
    }
輸出結(jié)果為false
兩個不同的sqlSession

      2.sqlSession相同,查詢條件不同。因為緩存條件不同,緩存中還沒有數(shù)據(jù)。

      3.sqlSession相同,在兩次相同查詢條件中間執(zhí)行過增刪改操作。(因為中間的增刪改可能對緩存中數(shù)據(jù)進行修改,所以不能用)

      4.sqlSession相同,手動清空了一級緩存。

        eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
    public void test01() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
         SqlSession session = sqlSessionFactory.openSession();
         EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
         try {
             Employee map  = mapper.getEmployeeById(1);
                         session.clearCache();
                         Employee map2  = mapper.getEmployeeById(1);
             System.out.println(map == map2);
             session.commit();
            } finally {
                session.close();
            }
    }
輸出結(jié)果為false.
因為手動清清除緩存,緩存失效

  二級緩存:全局緩存;基于namespace級別的緩存。一個namespace對應(yīng)一個二級緩存。

      工作機制:1.一個會話,查詢一條數(shù)據(jù),這個數(shù)據(jù)會被放在當(dāng)前會話的一級緩存中。

           2,如果會話被關(guān)閉了,一級緩存中的數(shù)據(jù)會被保存帶二級緩存。新的會話查詢信息就會參照二級緩存。

           3.sqlSession ====> Employee====>employee

            sqlSession ====>DepartmentMapper=====>Department

            不同的namespace查出的數(shù)據(jù)會放在自己對應(yīng)的緩存中。

           效果:查出的數(shù)據(jù)首先放在一級緩存中,只有一級緩存被關(guān)閉或者提交以后,一級緩存數(shù)據(jù)才會轉(zhuǎn)移到二級緩存

         使用步驟:

            1.開啟全局緩存配置。<settings><setting name='cacheEnabled' value='true'/></settings>

            2.因為是namespace級別,需要搭配每個xxxMapper.xml中配置二級緩存<cache></cache>

             <cache flushInterval='60000' size='512' readOnly='true' eviction='FIFO' type='' />

              eviction:緩存的回收策略:

                     LRU – 最近最少使用的:移除最長時間不被使用的對象。

                     FIFO – 先進先出:按對象進入緩存的順序來移除它們。

                     SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。

                     WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。

              flushInterval:緩存刷新間隔。緩存多久清空一次,默認不清空。設(shè)置一個毫秒值。

              readOnly:是否只讀。true:mybatis認為所有從緩存中獲取數(shù)據(jù)的操作都是只讀操作,不會修改數(shù)據(jù)。

                             mybatis為了加快獲取速度,直接就會將數(shù)據(jù)在緩存中的引用交給用戶。不安全,速度快。

                        false:mybatis覺得獲取的數(shù)據(jù)可能被修改。mybatis會利用序列化和反序列化的技術(shù)克隆一份新的數(shù)據(jù)給用戶。安全,速度快。

              size:緩存放多少元素。

              type:指定自定義緩存全類名。實現(xiàn)cache接口即可。

              3.pojo需要實現(xiàn)序列換接口。

        和緩存相關(guān)的配置/屬性:

              1.cacheEnabled:如果是false,關(guān)閉二級緩存,不關(guān)閉一級緩存。

              2.每個select標(biāo)簽都有userCache='true'屬性:對一級緩存沒有影響。設(shè)置為false,二級緩存失效。

              3.每個增刪改標(biāo)簽都有flushCache='true'屬性:一級緩存和二級緩存都會被清空。

              4.在查詢標(biāo)簽中flushCache='false'屬性:如果設(shè)置為true,查完會清空,一級二級緩存都會被清空,都不會用緩存。

              5.sqlSession.clearn():跟session有關(guān),只會清除一級緩存。

              6.localCacheScope:<settings><setting name='localCacheScope' value='SESSION'/></settings>本地緩存作用域。

                        一級緩存SESSION:當(dāng)前會話的所有數(shù)據(jù)保存到回話緩存中。STATEMENT:禁用一級緩存。

 

緩存首先一進來去查二級緩存,二級緩存沒有去找一級緩存,一級緩存沒有去找數(shù)據(jù)庫。二級緩存----->一級緩存-------->數(shù)據(jù)庫。

自定義緩存 implements Cache,重寫接口中的保存等方法,比如說保存到redis.

自定義緩存參照mybatis官網(wǎng)--->項目git代碼庫----->https://github.com/mybatis---->參照各種整合緩存

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MyBatis 延遲加載,一級緩存,二級緩存設(shè)置
Mybatis緩存及注意點
后端:MyBatis緩存知識介紹
mybatis
Mybatis一二級緩存的使用和實現(xiàn)原理
mybatis的緩存機制(一級緩存二級緩存和刷新緩存)和mybatis整合ehcache
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服