MyBatis的生命周期
所謂的生命周期就是第一個對象應該存活的時間,比如一些對象一次用完后就要關閉,使它們被Java虛擬機(JVM)銷毀,以避免繼續占用資源,所以我們會根據每一個組件的作用去確定其生命。
(一)、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用就是在於創建SqlSessionFactory,創建成功后,SqlSessionFactoryBuilder就失去了作用,所以它只能存在於創建SqlSessionFactory的方法中,而不要讓其長期存在。
(二)、SqlSessionFactory
SqlSessionFactory可以被認為是一個數據庫連接池,它的作用是創建SqlSession接口對象。因為MyBatis的本質就是Java對數據庫的操作,所以SqlSessionFactory的生命周期在於於整個MyBatis的應用之中,所以一旦創建了SqlSessionFactory的生命周期就等同於MyBatis的應用周期。
由於SqlSessionFactory是一個對數據庫的連接池,所以它占據着數據庫的連接資源。如果創建多個SqlSessionFactory,那么就存在多個數據庫連接池,這樣不利於對數據資源的控制,也會導致連接資源被消耗光,出現系統宕機等情況,所以盡量避免發生這樣的情況。因此在一般的應用中我們往往希望SqlSessionfactory作為一個單例,讓它在應用中補共享。
(三)、SqlSession
如果說SqlSessionFactory相當於數據庫連接池,那么SqlSession就相當於一個數據庫連接(Connection對象),你可以在一個事務里面執行多條SQL,然后通過它的commit、rollback等方法,提交或者回滾事務。所以它應該存活在一個業務請求中,處理完整個請求后,應該關閉這條連接,讓它歸還給SqlSessionFactory,否則數據庫資源就很快被消耗精光,系統應付癱瘓,所以用try...catch...fanally語句來保證其正確關閉。
(四)、Mapper
Mapper是一個接口,它由SqlSession所創建,所以它的最大生命周期至多和SqlSession保持一致,盡管它很好用,但是由於SqlSession關閉,它的數據庫連接資源也會消失,所以它的生命周期應該小於等於SqlSession的生命周期。Mapper代表是一個請求中的業務處理,所以它應該在一個請求中,一旦處理完了相關的業務,就應該廢棄它。
MyBatis的生命周期圖