關於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中的快取機制,我們先來看什麼是快取,簡單來說,快取就是存在於記憶體中的臨時資料。那麼,我們為什麼要使用快取呢,就是為了減少與資料庫的互動次數,提高執行效率。那麼問題來了,什麼樣的資料適合存在於快取中呢 首先是經常...