天天看點

MyBatis的緩存玩法

重要概念

  • SqlSession:代表和資料庫的一次會話,提供了操作資料庫的方法。
  • MappedStatement:代表要發往資料執行的指令,可以了解為SQL的抽象表示。
  • Executor:和資料庫互動的執行器,接收MappedStatement。
  • 映射接口:在接口中會要執行的SQL用一個方法表示,具體SQL寫在映射檔案中。
  • 映射檔案:編寫SQL的檔案。

一級緩存介紹

在代碼運作時,有可能會在一個資料庫會話中執行多次相同的SQL,這種反複的查詢會帶來開銷。

每一個SqlSession都持有自己的緩存,就是LocalCache。一種是Session級别的,在Mybatis中執行的所有語句都會共享這一個緩存。一種是Statement級别的,緩存隻對目前statement語句。

當發起查詢時,Mybatis會根據statementId、params、rowBounds生成一個key,去Cache查,如果沒有的話會去資料庫查,并且緩存到本地。

MyBatis的緩存玩法

一級緩存的不足

使用一級緩存的時候,因為緩存不能跨會話共享,不同的會話之間對于相同的資料可能有不一樣的緩存。在有多個會話或者分布式環境下,會存在髒資料的問題。如果要解決這個問題,就要用到二級緩存。MyBatis 一級緩存無法關閉,但是有兩種級别可選:

  1. session級别的緩存,在同一個sqlSession内,對同樣的查詢将不再查詢資料庫,直接從緩存中取。
  2. statement級别的緩存,為了避免上述問題,可以将一級緩存的級别設為 statement 級别的,這樣每次查詢結束都會清掉一級緩存。

二級緩存

二級緩存是用來解決一級緩存不能跨會話共享的問題的,在XML檔案配置後可以被多個SqlSession共享,生命周期和應用同步。

如果MyBatis使用了二級緩存,并且Mapper和select語句也配置使用了二級緩存,那麼在執行select查詢的時候,MyBatis會先從二級緩存中取輸入,其次才是一級緩存。

即MyBatis查詢資料的順序是:二級緩存 —> 一級緩存 —> 資料庫。

https://www.cnblogs.com/wuzhenzhao/p/11103043.html

MyBatis的緩存玩法

一、二級緩存的使用注意點

  • MyBatis預設的session級别一級緩存,由于Spring Boat 中預設使用了hikariCP,是以基本沒用,需要開啟事務才有用。但一級緩存作用域僅限同一sqlSession内,無法感覺到其他sqlSession的增删改,是以極易産生髒資料。
  • 二級緩存可通過cache-ref讓多個mapper.xml共享同一namespace,進而實作緩存共享,但多表聯查時配置略微繁瑣。
  • 生産環境建議将一級緩存設定為statment級别(即關閉一級緩存),如果有必要,可以開啟二級緩存。
  • 在分布式環境中也是不建議開啟二級緩存的,因為緩存是儲存到本地的,這樣也會導緻産生髒資料。