mybatis的兩級快取

2021-10-04 05:37:41 字數 2449 閱讀 6478

mybatis的快取有兩種,分為一級快取和二級快取,它們的作用域不同。

一級快取我個人也叫session快取,它預設是開啟的,不可配置的。為啥叫session快取,是因為它的作用域是session範圍內的,也就是說同乙個session的情況才能使用到一級快取,目前我遇到的情況就是在乙個事務內查詢兩次資料就會使用到一級快取。所以說這個一級快取其實很坑的,基本使用不到,在分布式環境下還可能有***。

特點總結如下:

預設開啟;

快取的效果很雞肋,分布式環境還可能有***。

原始碼在baseexecutor類下,如下:

@override

public

list

query

throws sqlexception

public

list

query

throws sqlexception

if(querystack ==

0&& ms.

isflushcacherequired()

) list

list;

tryelse

}finally

if(querystack ==0)

// issue #601

deferredloads.

clear()

;if(configuration.

getlocalcachescope()

== localcachescope.statement)

}return list;

}/**

在事務提交或者回滾的時候,會清空快取。

**/@override

public

void

commit

(boolean required)

throws sqlexception

clearlocalcache()

;flushstatements()

;if(required)

}@override

public

void

rollback

(boolean required)

throws sqlexception

finally}}

}

在事務提交或者回滾的時候,會清空快取。

原始碼分析,主要入口在org.apache.ibatis.executor.cachingexecutor中query方法和update方法,裡面有個成員變數org.apache.ibatis.cache.transactionalcachemanager物件,管理著org.apache.ibatis.cache.decorators.transactionalcache事務,在事務中提交或者回滾事務都會清空對應快取,如下:

cachingexecutor類**

@override

public

intupdate

throws sqlexception

// 根據配置是否每次都重新整理快取

private

void

flushcacheifrequired

}@override

public

list

query

throws sqlexception

@override

public

list

query

throws sqlexception

return list;}}

return delegate.

query

(ms, parameterobject, rowbounds, resulthandler, key, boundsql)

;}

transactionalcache類**

@override

public

void

clear()

public

void

commit()

flushpendingentries()

;reset()

;}public

void

rollback()

private

void

reset()

// 重新整理合併快取鍵值對

private

void

flushpendingentries()

for(object entry : entriesmissedincache)

}}

mybatis的快取都比較雞肋,不推薦使用。

mybatis一級快取詳解

mybatis 二級快取全詳解

mybatis兩級快取原理剖析

對於mybatis的快取認識一直有乙個誤區,所以今天寫一篇文章幫自己訂正一下。mybatis的快取分一級快取與二級快取。下面分別對這兩種快取進行詳細解說。首先我們需要大致的了解一下mybatis的呼叫鏈,然後才能更好的理解mybatis的快取。主要的api羅列如下 public inte ce sq...

兩級節點的樹

兩級節點的樹 效果圖 說明 這是只顯示兩級節點的樹,並且窗體載入的時候樹就成展開形式,並不需要非同步載入!jsp 初始投訴分類 function p initpreclass single true function listcomplain classid d5 gridmanager.loadd...

3 1 9 兩級頁表

單級頁表的幾個問題 1 因為頁表的特性,需要連續存放,當程序需要很多個頁面,就需要很大的頁表,就需要很大一塊連續的區域去存放頁表 2 根據區域性性原理,沒必要讓頁表常駐記憶體 因為頁表太大,需要連續一大片記憶體的解決方法是 重新建立起對一級頁表的頁表,頁目錄表 將邏輯位址程序拆分成一級頁號和二級頁號...