MyBatis的快取玩法

BLLBL發表於2021-10-03

重要概念

  • SqlSession:代表和資料庫的一次會話,提供了運算元據庫的方法。

  • MappedStatement:代表要發往資料執行的命令,可以理解為SQL的抽象表示。

  • Executor:和資料庫互動的執行器,接收MappedStatement。

  • 對映介面:在介面中會要執行的SQL用一個方法表示,具體SQL寫在對映檔案中。

  • 對映檔案:編寫SQL的檔案。

一級快取介紹

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

每一個SqlSession都持有自己的快取,就是LocalCache。一種是Session級別的,在Mybatis中執行的所有語句都會共享這一個快取。一種是Statement級別的,快取只對當前statement語句。

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

image

一級快取的不足

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

  1. session級別的快取,在同一個sqlSession內,對同樣的查詢將不再查詢資料庫,直接從快取中取。

  2. statement級別的快取,為了避免上述問題,可以將一級快取的級別設為 statement 級別的,這樣每次查詢結束都會清掉一級快取。

二級快取

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

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

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

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

image

一、二級快取的使用注意點

  • MyBatis預設的session級別一級快取,由於Spring Boat 中預設使用了hikariCP,所以基本沒用,需要開啟事務才有用。但一級快取作用域僅限同一sqlSession內,無法感知到其他sqlSession的增刪改,所以極易產生髒資料。

  • 二級快取可通過cache-ref讓多個mapper.xml共享同一namespace,從而實現快取共享,但多表聯查時配置略微繁瑣。

  • 生產環境建議將一級快取設定為statment級別(即關閉一級快取),如果有必要,可以開啟二級快取。

  • 在分散式環境中也是不建議開啟二級快取的,因為快取是儲存到本地的,這樣也會導致產生髒資料。

相關文章