首先,最底層的介面是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:第二步,我們呼叫
startmanagedsession
方法來使sqlsessionmanager內部維護的localsqlsession
變數生效,這一步操作中會涉及到對executor的獲取,我們來看一下**實現:
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之間...