mybatis的作用域(Scope)和生命週期

2021-08-07 08:15:52 字數 1464 閱讀 9079

sqlsessionfactorybuilder

這個類可以被例項化、使用和丟棄,一旦建立了 sqlsessionfactory,就不再需要它了。因此 sqlsessionfactorybuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數)。你可以重用 sqlsessionfactorybuilder 來建立多個 sqlsessionfactory 例項,但是最好還是不要讓其一直存在以保證所有的 xml 解析資源開放給更重要的事情。

sqlsessionfactory

sqlsessionfactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由對它進行清除或重建。使用 sqlsessionfactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建 sqlsessionfactory 被視為一種**「壞味道(bad smell)」。因此 sqlsessionfactory 的最佳作用域是應用作用域。有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

sqlsession

每個執行緒都應該有它自己的 sqlsession 例項。sqlsession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。絕對不能將 sqlsession 例項的引用放在乙個類的靜態域,甚至乙個類的例項變數也不行。也絕不能將 sqlsession 例項的引用放在任何型別的管理作用域中,比如 servlet 架構中的 httpsession。如果你現在正在使用一種 web 框架,要考慮 sqlsession 放在乙個和 http 請求物件相似的作用域中。換句話說,每次收到的 http 請求,就可以開啟乙個 sqlsession,返回乙個響應,就關閉它。這個關閉操作是很重要的,你應該把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。下面的示例就是乙個確保 sqlsession 關閉的標準模式:

sqlsession session = sqlsessionfactory.opensession();

try finally

在你的所有的**中一致性地使用這種模式來保證所有資料庫資源都能被正確地關閉。

對映器是建立用來繫結對映語句的介面。對映器介面的例項是從 sqlsession 中獲得的。因此從技術層面講,對映器例項的最大作用域是和 sqlsession 相同的,因為它們都是從 sqlsession 裡被請求的。儘管如此,對映器例項的最佳作用域是方法作用域。也就是說,對映器例項應該在呼叫它們的方法中被請求,用過之後即可廢棄。並不需要顯式地關閉對映器例項,儘管在整個請求作用域(request scope)保持對映器例項也不會有什麼問題,但是很快你會發現,像 sqlsession 一樣,在這個作用域上管理太多的資源的話會難於控制。所以要保持簡單,最好把對映器放在方法作用域(method scope)內。下面的示例就展示了這個實踐:

sqlsession session = sqlsessionfactory.opensession();

try finally

Mybatis作用域和生命週期

理解作用域和生命週期類非常重要,如果使用不當,會造成各種各樣的問題 這個類可以被初始 使用和丟棄,如果你已經建立好了乙個 sqlsessionfactory 後就不用再保留它。因此,sqlsessionfactorybuilder 的最好作用域是方法體內,比如說定義乙個方法變數。你可以重複使用sql...

Javascript的作用域域作用域鏈的理解

如何解析一段可執行 分了兩個階段 解析 和執行 其中解析 可以理解為記名字,就是先把關鍵字var和function定義的變數名登記了下來,這也就有了變數提公升這一說。在執行 階段才是真正的執行賦值,運算等操作。暫不解析這幾個名詞,先來看乙個例子。var scope global function f...

作用域 的作用

1 作用域符號 的前面一般是類名稱,後面一般是該類的成員名稱,c 為例避免不同的類有名稱相同的成員而採用作用域的方式進行區分 如 a,b表示兩個類,在a,b中都有成員member。那麼 a member就表示類a中的成員member b member就表示類b中的成員member 2 全域性作用域符...