Mybatis Executor原始碼解析(二)

2021-09-22 05:44:12 字數 3158 閱讀 6142

首先,最底層的介面是executor,有兩個實現類:baseexecutor和cachingexecutor,cachingexecutor用於二級快取,而baseexecutor則用於一級快取及基礎的操作。並且由於baseexecutor是乙個抽象類,提供了三個實現:******executor,batchexecutor,reuseexecutor,而具體使用哪乙個executor則是可以在mybatis-config.xml中進行配置的。配置如下:

如果沒有配置executor,預設情況下是******executor。

對cachingexecutor我們暫時不分析,等在學習mybatis快取的時候再一併分析。

******executor是最簡單的執行器,根據對應的sql直接執行即可,不會做一些額外的操作;

batchexecutor執行器,顧名思義,通過批量操作來優化效能。通常需要注意的是批量更新操作,由於內部有快取的實現,使用完成後記得呼叫flushstatements來清除快取。

reuseexecutor 可重用的執行器,重用的物件是statement,也就是說該執行器會快取同乙個sql的statement,省去statement的重新建立,優化效能。內部的實現是通過乙個hashmap來維護statement物件的。由於當前map只在該session中有效,所以使用完成後記得呼叫flushstatements來清除map。

private final mapstatementmap = new hashmap();
這幾個executor的生命週期都是侷限於sqlsession範圍內。

大概了解了各個executor的具體含義之後,我們來看一下executor是如何初始化的。

我們以預設不配置defaultexecutortype情況下為例,並且不開啟二級快取。

我們還是以上文的例子來說:

inputstream inputstream = resources.getresourceasstream(resource);

sqlsessionmanager sessionmanager = sqlsessionmanager.newinstance(inputstream);

sessionmanager.startmanagedsession();

// 執行

liststudent = sessionmanager.selectlist(statement);

system.out.println(student);

第一步,首先我們獲取sqlsessionmanager,這裡就不多說了,上文已經詳細說過了;

第二步,我們呼叫startmanagedsession方法來使sqlsessionmanager內部維護的localsqlsession變數生效,這一步操作中會涉及到對executor的獲取,我們來看一下**實現:

首先,我們呼叫startmanagedsession:

public void startmanagedsession()
在呼叫startmanagedsession的過程中,會呼叫opensession來建立獲取sqlsession:

public sqlsession opensession() 

public sqlsession opensession()

在獲取sqlsession的過程中會呼叫opensessionfromdatasource來獲取:

private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level, boolean autocommit)  catch (exception e)  finally 

}

接著,這裡會通過configuration.newexecutor來獲取executor:

public executor newexecutor(transaction transaction, executortype executortype)  else if (executortype.reuse == executortype)  else 

// cacheenabled 也就是我們配置的二級快取,如果該值配置為true,則獲取的是cachingexecutor

if (cacheenabled)

// 這裡是通過責任鏈模式來生成**物件

executor = (executor) interceptorchain.pluginall(executor);

return executor;

}

而在newexecutor方法中,我們完成了對executor的獲取。

而在executor執行對應的方法的時候,我們還有一點可以注意下,就是sqlsessionmanager中**物件的處理。**物件會通過呼叫sqlsessioninterceptor的invoke方法來呼叫實際的方法。

public object invoke(object proxy, method method, object args) throws throwable  catch (throwable t) 

} else catch (throwable t) finally }}

總結

mybatis一次會話中對資料庫的增刪改查是通過executor來實現的;

executor的結構比較簡單,其中我們只需注意下它的體系結構及初始化方式;

baseexecutor這裡採用了模板方法模式,值得我們學習下;

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Integer原始碼解析

public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...