会话创建过程-创建Executor
我們知道,Executor 的基本類型有三種:SIMPLE、BATCH、REUSE,默認(rèn)是SIMPLE(settingsElement()讀取默認(rèn)值),他們都繼承了抽象類BaseExecutor。
為什么要讓抽象類實(shí)現(xiàn)接口,然后讓具體實(shí)現(xiàn)類繼承抽象類?(模板方法模式)
“定義一個(gè)算法的骨架,并允許子類為一個(gè)或者多個(gè)步驟提供實(shí)現(xiàn)。 模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。”問題:三種類型的區(qū)別(通過update()方法對(duì)比)?
SimpleExecutor:每執(zhí)行一次update 或select,就開啟一個(gè)Statement 對(duì)象,用完立刻關(guān)閉Statement 對(duì)象。
ReuseExecutor:執(zhí)行update 或select,以sql 作為key 查找Statement 對(duì)象,存在就使用,不存在就創(chuàng)建,用完后,不關(guān)閉Statement 對(duì)象,而是放置于Map 內(nèi),供下一次使用。簡(jiǎn)言之,就是重復(fù)使用Statement 對(duì)象。
BatchExecutor:執(zhí)行update(沒有select,JDBC 批處理不支持select),將所有sql 都添加到批處理中(addBatch()),等待統(tǒng)一執(zhí)行(executeBatch()),它緩存了多個(gè)Statement 對(duì)象,每個(gè)Statement 對(duì)象都是addBatch()完畢后,等待逐一執(zhí)行executeBatch()批處理。與JDBC 批處理相同。
如果配置了cacheEnabled=ture,會(huì)用裝飾器模式對(duì)executor 進(jìn)行包裝:new?CachingExecutor(executor)。
包裝完畢后,會(huì)執(zhí)行:
executor = (Executor) interceptorChain.pluginAll(executor);此處會(huì)對(duì)executor 進(jìn)行包裝。
回答了前面的問題:數(shù)據(jù)源和事務(wù)工廠在哪里會(huì)用到——?jiǎng)?chuàng)建執(zhí)行器的時(shí)候。
最終返回DefaultSqlSession,屬性包括Configuration、Executor 對(duì)象。
總結(jié):創(chuàng)建會(huì)話的過程,我們獲得了一個(gè)DefaultSqlSession,里面包含了一個(gè)Executor,它是SQL 的執(zhí)行者。
?
總結(jié)
以上是生活随笔為你收集整理的会话创建过程-创建Executor的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会话创建过程-创建Transaction
- 下一篇: MyBatis 源码解读-获得Mappe