歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Mybatis延遲加載和查詢緩存

Mybatis延遲加載和查詢緩存

日期:2017/3/1 9:13:49   编辑:Linux編程

閱讀目錄

  • 一、延遲加載
  • 二、查詢緩存

一、延遲加載

  resultMap可以實現高級映射(使用association、collection實現一對一及一對多映射),association、collection具備延遲加載功能。

  延遲加載:先從單表查詢,需要時再從關聯表去關聯查詢,大大提高數據庫性能,因為查詢單表要比關聯查詢多張表速度要快。

在mybatis核心配置文件中配置:

lazyLoadingEnabled、aggressiveLazyLoading

設置項

描述

允許值

默認值

lazyLoadingEnabled

全局性設置懶加載。如果設為‘false’,則所有相關聯的都會被初始化加載。

true | false

false

aggressiveLazyLoading

當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。

true | false

true

<settings>

      <setting name="lazyLoadingEnabled" value="true"/>

      <setting name="aggressiveLazyLoading" value="false"/>

</settings>

  場合:

當只有部分記錄需要關聯查詢其它信息時,此時可按需延遲加載,需要關聯查詢時再向數據庫發出sql,以提高數據庫性能。

當全部需要關聯查詢信息時,此時不用延遲加載,直接將關聯查詢信息全部返回即可,可使用resultType或resultMap完成映射。

二、查詢緩存

  Mybatis提供查詢緩存,用於減輕數據壓力,提高數據庫壓力。

  Mybatis提供一級緩存和二級緩存。

  

  在操作數據庫時需要構造SqlSession對象,在對象中有一個數據結構(HashMap)用於緩存數據。

  不同的SqlSession之間的緩存數據區域是互相不影響的。

  Mybatis一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束後該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。

  Mybatis二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執行相同的sql語句,第一次執行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。

  1、一級緩存

  

  第一次發起查詢,先去找緩存中是否有id為1的用戶信息,如果沒有,從數據庫中查詢用戶信息。

  得到用戶信息,將用戶信息存儲到一級緩存中。

  第二次發起查詢用戶id為1的用戶信息,先去緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。

  如果SqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級緩存。目的是為了讓緩存中存儲的是最新的信息,避免髒讀。

  Mybatis默認支持一級緩存,不需要在配置文件中配置。

  Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象。

  應用場景:

  

  2、二級緩存

  

  SqlSession1去查詢用戶id為1的用戶信息,查詢到用戶信息會將查詢數據存儲到二級緩存中。

  SqlSession2去查詢用戶id為1的用戶信息,去緩存中找是否存在數據,如果存在直接從緩存中取出數據。

  二級緩存區域是根據mapper的namespace劃分的,相同namespace的mapper查詢數據放在同一個區域,如果使用mapper代理方法每個mapper的namespace都不同,此時可以理解為二級緩存區域是根據mapper劃分。

每次查詢會先從緩存區域找,如果找不到從數據庫查詢,查詢到數據將數據寫入緩存。

  Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的java對象

  sqlSession執行insert、update、delete等操作commit提交後會清空緩存區域。

  開啟二級緩存

  在核心配置文件SqlMapConfig.xml中加入

<setting name="cacheEnabled" value="true"/>

描述

允許值

默認值

cacheEnabled

對在此配置文件下的所有cache 進行全局性開/關設置。

true false

true


要在你的Mapper映射文件中添加一行: <cache /> ,表示此mapper開啟二級緩存。

  二級緩存需要查詢結果映射的pojo對象實現java.io.Serializable接口實現序列化和反序列化操作,注意如果存在父類、成員pojo都需要實現序列化接口。

  為了將緩存數據取出執行反序列化,因為二級緩存存儲介質多種多樣,不一定在內存。

  禁用二級緩存:

  在statement中設置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。

  <select id="findOrderListResultMap" resultMap="orderSUSErMap" useCache="false">

  刷新緩存(就是清空緩存)

  設置statement配置中的flushCache="true" 屬性,默認情況下為true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現髒讀。

  <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

  應用場景

  對於訪問多的查詢請求且用戶對查詢結果實時性要求不高,此時可采用mybatis二級緩存技術降低數據庫訪問量,提高訪問速度,業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。

實現方法如下:通過設置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據數據變化頻率設置緩存刷新間隔flushInterval,比如設置為30分鐘、60分鐘、24小時等,根據需求而定。

  局限性

  mybatis二級緩存對細粒度的數據級別的緩存實現不好,比如如下需求:對商品信息進行緩存,由於商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩存就無法實現當���個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區域以mapper為單位劃分,當一個商品信息變化會將所有商品信息的緩存數據全部清空。解決此類問題需要在業務層根據需求對數據有針對性緩存。

MyBatis入門學習教程 http://www.linuxidc.com/Linux/2015-02/113771.htm

Java實戰應用:Mybatis實現單表的增刪改 http://www.linuxidc.com/Linux/2014-06/103456.htm

[Java][Mybatis]物理分頁實現 http://www.linuxidc.com/Linux/2014-04/99889.htm

Mybatis快速入門教程 http://www.linuxidc.com/Linux/2013-06/85762.htm

Mybatis的關於批量數據操作的測試 http://www.linuxidc.com/Linux/2012-05/60863.htm

Mybatis中對List<Object> 對象List的批處理插入操作 http://www.linuxidc.com/Linux/2014-02/96916.htm

MyBatis 的詳細介紹:請點這裡
MyBatis 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved