mybatis入門-4 mybatis中的延遲加載和緩存

什麼是延遲加載:java

  resultMap中的association和collection標籤具備延遲加載的功能。延遲加載就是在咱們關聯查詢的時候李勇延遲加載,先加載主信息,使用到關聯信息的時候再去加載關聯信息。通俗一點講就是一個類裏面引用另外一個類,當使用到另外一個類的時候另外一個類再去賦值。算法

設置延遲加載:sql

  在myabtis的全局配置文件裏面配置全局加載 lazyLoadingEnabled、aggressiveLazyLoading數據庫

 

 

 

<!-- 開啓延遲加載 -->
    <settings>
        <!-- lazyLoadingEnabled:延遲加載啓動,默認是false -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- aggressiveLazyLoading:積極的懶加載,false的話按需加載,默認是true -->
        <setting name="aggressiveLazyLoading" value="false"/>
         
    </settings>

一級緩存:緩存

  mybatis對緩存提供了支持,可是在沒有配置的狀況下,他只是默認的開啓了第一緩存,一級緩存只是相對於SqlSession而言,因此在參數和SQL徹底同樣的狀況下,咱們使用同一個SqlSession對象調用一個Mapper方法,每每只執行一次SQL,由於使用SqlSession第一次查詢後,Mybatis會把結果放到緩存中,下次查詢只要沒有聲明刷新,沒有作更新操做,而且緩存沒有超時的狀況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。安全

 

 

 

 

 

 一級緩存注意一下幾點:mybatis

1.一級緩存何時會清空:app

  a.MyBatis在開啓一個數據庫會話時,會建立一個新的SqlSession對象,SqlSession對象中會有一個新的Executor對象。Executor對象中持有一個新的PerpetualCache對象,當會話結束時,SqlSession對象及其內部的Executor對象還有PerpetualCache對象也一併釋放掉。性能

  b.若是SqlSession調用了close()方法,會釋放掉一級緩存PerpetualCache對象,一級緩存將不可用。spa

  c.若是SqlSession調用了clearCache(),會清空PerpetualCache對象中的數據,可是該對象仍可以使用。

  d.SqlSession中執行了任何一個update操做(update()、delete()、insert()) ,都會清空PerpetualCache對象的數據,可是該對象能夠繼續使用.

2.在什麼狀況下會用調用緩存:

  當知足下列條件後,mybatis會認爲兩次查詢爲同一個查詢,則會到緩存裏面調用緩存。

  a. 傳入的statementId是相同的

  b. 查詢條件是相同的(查詢時要求的結果集中的結果範圍)

  c. 此次查詢所產生的最終要傳遞給JDBC java.sql.Preparedstatement的Sql語句字符串(boundSql.getSql() )

  d. 傳遞給java.sql.Statement要設置的參數值

二級緩存:

  MyBatis的二級緩存是Application級別的緩存,它能夠提升對數據庫查詢的效率,以提升應用的性能。

  

 

 

   

 

 

  SqlSessionFactory 層面上的二級緩存默認是不開啓的,耳機華潤的開啓須要進行配置。實現二級緩存的時候,Mybatis要求返回的POJO必須是序列化的。配置主須要在xml裏面開啓緩存就能夠了:

  1.1 全局配置文件

<!-- 開啓延遲加載 -->
    <settings>
            
        <!-- 開啓二級緩存,默認是false -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

  1.2 本身的 mapper 文件

<mapper namespace="cm.mbs.dao.BlogMapper">
    <!-- 開啓不本mapper的namespace下的二級緩存 -->
    <cache/>

 

第一次調用mapper下的SQL去查詢用戶信息。查詢到的信息會存到該mapper對應的二級緩存區域內。

第二次調用相同namespace下的mapper映射文件中相同的SQL去查詢用戶信息。會去對應的二級緩存內取結果。

若是調用相同namespace下的mapper映射文件中的增刪改SQL,並執行了commit操做。此時會清空該namespace下的二級緩存。

  

二級緩存注意的點: 

  • 映射語句文件中的全部select語句將會被緩存。
  • 映射語句文件中的全部insert、update和delete語句會刷新緩存。
  • 緩存會使用默認的Least Recently Used(LRU,最近最少使用的)算法來收回。
  • 根據時間表,好比No Flush Interval,(CNFI沒有刷新間隔),緩存不會以任什麼時候間順序來刷新。
  • 緩存會存儲列表集合或對象(不管查詢方法返回什麼)的1024個引用
  • 緩存會被視爲是read/write(可讀/可寫)的緩存,意味着對象檢索不是共享的,並且能夠安全的被調用者修改,不干擾其餘調用者或線程所作的潛在修改。
相關文章
相關標籤/搜索