MyBatis入門——核心對象的生命週期(SqlSessionFactoryBuilder,SqlSessionFactory, SqlSession和Mapper)

2、核心對象的生命週期

從上一篇文章中,咱們能夠看出mybatis操做數據庫主要使用了4個核心對象:SqlSessionFactoryBuilder,SqlSessionFactory, SqlSession和Mapper。那麼,在軟件系統中,這個幾個對象的生命週期是什麼樣的呢?何時建立?何時銷燬?java

1. SqlSessionFactoryBuilder

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactoryBuilder 是用來建立SqlSessionFactory的,能夠被實例化、使用和丟棄,一旦建立了SqlSesionFactory,就再也不須要它了。所以,SqlSessionFactoryBuilder實例的最佳做用域是方法做用域,也就是局部方法變量。sql

2. SqlSessionFactory

SqlSessionFactory 一旦被建立就應該在應用的運行期間一直存在,沒有任何理由丟棄它或從新建立另外一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複建立屢次,屢次重建 SqlSessionFactory 被視爲一種代碼「壞味道(bad smell)」。所以 SqlSessionFactory 的最佳做用域是應用做用域。 有不少方法能夠作到,最簡單的就是使用單例模式或者靜態單例模式。數據庫

3. SqlSession

每一個線程都應該有它本身的 SqlSession 實例。SqlSession 的實例不是線程安全的,所以是不能被共享的,因此它的最佳的做用域是請求或方法做用域絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也毫不能將 SqlSession 實例的引用放在任何類型的託管做用域中,好比 Servlet 框架中的 HttpSession。 若是你如今正在使用一種 Web 框架,要考慮 SqlSession 放在一個和 HTTP 請求對象類似的做用域中。 換句話說,每次收到的 HTTP 請求,就能夠打開一個 SqlSession,返回一個響應,就關閉它。 這個關閉操做是很重要的,你應該把這個關閉操做放到 finally 塊中以確保每次都能執行關閉。安全

4. Mapper

映射器是一些由你建立的、綁定你映射的語句的接口。映射器接口的實例是從 SqlSession 中得到的。所以從技術層面講,任何映射器實例的最大做用域是和請求它們的 SqlSession 相同的。儘管如此,映射器實例的最佳做用域是方法做用域。 也就是說,映射器實例應該在調用它們的方法中被請求,用過以後便可丟棄。 並不須要顯式地關閉映射器實例,儘管在整個請求做用域保持映射器實例也不會有什麼問題,可是你很快會發現,像 SqlSession 同樣,在這個做用域上管理太多的資源的話會難於控制。 爲了不這種複雜性,最好把映射器放在方法做用域內。mybatis

5. 總結

對象 生命週期
SqlSessionFactoryBuilder 方法做用域,建立完SqlSessionFactory後就銷燬
SqlSessionFactory 應用做用域,貫穿整個應用,直到應用結束
SqlSession 請求/方法做用域
Mapper 方法做用域

相關文章
相關標籤/搜索