二級快取
使用mybatis二級快取的缺陷:(一般情況下不使用mybatis的二級快取,使用redis等替代)
mybatis定義了兩級快取:一級快取、二級快取
一級快取:同乙個sqlsession物件(與資料庫的同一次會話期間),多次呼叫同乙個方法的同乙個引數,只會第一次去資料庫查詢,然後把資料寫到一級緩衝中,以後直接先從快取中取出資料,不會直接去查資料庫。
二級快取:與資料庫第一次會話,資料就會快取到一級快取中,會話關閉後,一級快取中的資料就會儲存到二級快取中。
先查二級快取,再查一級快取,再查資料庫;即使在乙個sqlsession中,也會先查二級快取。
一級快取的作用域有兩種:session(預設)和statment,可通過設定local-cache-scope 的值來切換,預設為session。
二者的區別在於session會將快取作用於同乙個sqlsesson,而statment僅針對一次查詢,所以,local-cache-scope: statment可以理解為關閉一級快取。
mybatis
:configuration
:local-cache-scope
: session
@test
@transactional
@rollback
(value =
false
)public
void
test01()
(1)sqlsession物件不同不同的sqlsession物件之間快取不能共享。
@test
@transactional
@rollback
(value =
false
)public
void
test01()
(2)sqlsession物件相同,查詢條件不同
@test
@transactional
@rollback
(value =
false
)public
void
test01()
(3)sqlsession物件相同,兩次查詢之間執行了增刪改操作
@test
@transactional
@rollback
(value =
false
)public
void
test01()
(4)sqlsession物件相同,手動清除了一級快取: sqlsession.clearcache()
@test
@transactional
@rollback
(value =
false
)public
void
test01()
(5)使用資料庫連線池時,未開啟事務會導致一級快取失效
當使用資料庫連線池時,預設每次查詢完之後會自動進行事務提交,這就導致兩次查詢使用的不是同乙個sqlsessioin,一級快取永遠也不會生效。當我們在方法上加事務註解@transactional,兩次查詢都在同乙個sqlsession中,從而讓第二次查詢命中了一級快取
namespace
=>
/>
"getgoodsbyid"
resulttype
="top.onething.ssm.entity.goods"
>
select * from cmm_goods where goods_id=# limit
select
>
"insert"
usegeneratedkeys
="true"
keycolumn
="goods_id"
keyproperty
="goodsid"
>
insert into cmm_goods(goods_type,goods_name,goods_status)
value(#,#,#)
insert
>
>
二級快取是預設啟用的,如果想顯示的啟用,則需要在配置檔案中配置mybatis.configuration.cache-enabled=true,此外也可以通spring的方法啟用,參考下文中spring方式禁用二級快取
@test
@transactional
@rollback
(value =
false
)public
void
test01()
執行結果:
cache hit ratio 表示快取命中率。開啟二級快取後,每執行一次查詢,系統都會計算一次二級快取的命中率。圖中第一次查詢也是先從快取中查詢,只不過快取中一定是沒有的,所以命中率為0。但第二次查詢是從二級快取中讀取的,所以這一次的命中率為1/2=0.5。當然,若有第三次查詢,則命中率為2/3=0.66
mybatis
:configuration
:cache-enabled
:false
mybatis
:config-location
: classpath:mybatis-config.xml第二步:在指定的mybatis配置檔案mybatis-config.xml中配置二級快取
<?xml version="1.0" encoding="utf-8" ?>
>
>
name
="cacheenabled"
value
="false"
/>
settings
>
configuration
>
"getgoodsbyid"
resulttype
="top.onething.ssm.entity.goods"
usecache
="false"
>
select * from cmm_goods where goods_id=#
select
>
namespace
=/>
mybatis快取機制
mybatis和hibernate一樣,也提供了一二級快取。若存在一二級快取,則資料不會去資料庫互動,而是去記憶體中獲取。一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構 一般來說是hashmap 來儲存快取資料。不同的sqlsessi...
MyBatis 快取機制
mybatis 提供了查詢快取來獲取資料,以提高查詢的效能。mybatis 的快取分為一級快取和二級快取。1 一級快取一級快取是 sqlsession 級別的快取,是基於 hashmap 的本地快取。不同的 sqlsession 之間的快取資料區域互不影響。當同乙個 sqlsession 執行兩次相...
Mybatis 快取機制
查詢快取主要是為了提高查詢訪問速度,即當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。如果在快取中找到了資料那叫做命中。同一sqlsession 多次查詢同一sql時會使用快取 test public void testlocalc...