mybatis中的快取問題

2021-07-26 21:43:12 字數 1958 閱讀 5026

關於mybatis基礎我們前面幾篇部落格已經介紹了很多了,今天我們來說乙個簡單的問題,那就是mybatis中的快取問題。mybatis本身對快取提供了支援,但是如果我們沒有進行任何配置,那麼預設情況下系統只開啟了一級快取,一級快取就是同乙個sqlsession執行的相同查詢是會進行快取的,ok,那麼今天我們就來看看這些快取,並簡單驗證下。

這個快取系統預設情況下是開啟的,當我們獲取到乙個sqlsession物件之後,如果呼叫sqlsession中的同乙個方法查詢同一條資料,那麼第二次查詢將不會去資料庫中查詢,因為第一次查詢有快取,直接呼叫快取資料即可,除非快取超時或者我們明確宣告資料要重新整理,否則都是直接呼叫快取資料。ok,我們來看乙個簡單的案例。

查詢**如下:

sqlsession sqlsession = null;

try catch (exception e) finally

}

我們來看看日誌:

小夥伴們看到,我這裡執行了兩次查詢,但實際上只執行了一次sql語句。

<?xml version="1.0" encoding="utf-8" ?>

id="getuser"

resulttype="org.sang.bean.user"

parametertype="long">

select * from user where id = #

select>

id="insertuser"

parametertype="org.sang.bean.user">

insert into user(username,password,address) values (#,#,#)

insert>

id="deleteuser"

parametertype="long">

delete from user where id=#

delete>

id="getall"

resulttype="u">

select * from user

select>

這樣簡單配置之後,二級快取就算開啟了,這樣的配置中,許多東西都是預設的,比如所有的select語句都會被快取,所有的delete、insert和update則都會將快取重新整理,還比如快取將使用lru演算法進行記憶體**等。那麼這些東西如果需要配置的話,我們可以按如下方式進行配置:

,這裡的eviction表示快取策略,除了lru之外還有先進先出(fifo)、軟引用(soft)、弱引用(weak)等,flushinterval則表示重新整理時間,表示快取的物件個數,readonly為true則表示快取只可以讀取不可以修改。

ok,做了如上配置之後還不夠,開啟二級快取還要求我們的實體類可以序列化,實現serializable介面即可,如下:

public

class

user

implements

serializable

如此之後,我們的二級快取就算成功開啟了,ok,我麼來測試下:

sqlsession sqlsession = null;

sqlsession sqlsession2 = null;

try catch (exception e) finally

if (sqlsession2 != null)

}

列印日誌如下:

ok,小夥伴們看到sql語句實際上只執行了一次。

ok,以上就是對mybatis中快取的乙個簡單介紹。

mybatis中的快取問題

關於mybatis基礎我們前面幾篇部落格已經介紹了很多了,今天我們來說乙個簡單的問題,那就是mybatis中的快取問題。mybatis本身對快取提供了支援,但是如果我們沒有進行任何配置,那麼預設情況下系統只開啟了一級快取,一級快取就是同乙個sqlsession執行的相同查詢是會進行快取的,ok,那麼...

MyBatis中的快取

mybatis作為持久化框架,提供了非常強大的快取特性。一般在提到mybatis快取的時候,指的都是二級快取。一級快取,即本地快取,缺省會啟用並且不能控制,可能會導致一些難以發現的錯誤。一 一級快取 public void testl1cache finally system.out.println...

Mybatis中的快取

title mybatis中的快取 tags 新建,模板,小書匠 想要了解mybatis中的快取機制,我們先來看什麼是快取,簡單來說,快取就是存在於記憶體中的臨時資料。那麼,我們為什麼要使用快取呢,就是為了減少與資料庫的互動次數,提高執行效率。那麼問題來了,什麼樣的資料適合存在於快取中呢 首先是經常...