1. 程式人生 > >MyBatis 四大核心元件的生命週期

MyBatis 四大核心元件的生命週期

首先要明確 MyBatis 的四大核心元件為哪些。

  • SqlSessionFactoryBuilder (構造器):它會根據配置或者程式碼來生成 SqlSessionFactory,採用的是分部構建的 Builder 模式。
  • SqlSessionFactory(工廠介面):依靠它來生成 SqlSession,使用的是工廠模式。
  • SqlSession(會話):一個既可以傳送 SQL 執行返回結果,也可以獲取 Mapper 的介面。在現有的技術中,一般我們會讓其在業務邏輯程式碼中“消失”,而使用的是 MyBatis 提供的 SQL Mapper 介面程式設計技術,它能提高程式碼的可讀性和可維護性。
  • SQL Mapper(對映器):MyBatis 新設計存在的元件,它由一個 Java 介面和 XML 檔案(或註解)構成,需要給出對應的 SQL 和對映規則。它負責傳送 SQL 去執行,並返回結果。

在瞭解了四大元件的功能後,我們進一步來探討其生命週期。所謂生命週期就是每一個物件應該存活的時間,比如一些物件一次用完後就要關閉,使它們被 Java 虛擬機器(JVM)銷燬,以避免繼續佔用資源,所以我們會根據每一個元件的作用去確定其生命週期。

一、SqlSessionFactoryBuilder

SqlSessionFactoryBuilder 的作用在於建立 SqlSessionFactory,建立成功後,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在於建立 SqlSessionFactory 的方法中,而不要讓其長期存在。

二、SqlSessionFactory

SqlSessionFactory 可以被認為是一個數據庫連線池,它的作用是建立 SqlSession 介面物件。因為 MyBatis 的本質就是 Java 對資料庫的操作,所以 SqlSessionFactory 的生命週期存在於整個 MyBatis 的應用之中,所以一旦建立了 SqlSessionFactory ,就要長期儲存它,直至不再使用 MyBatis 應用,所以可以認為 SqlSessionFactory 的生命週期就等同於 MyBatis 的應用週期。

由於 SqlSessionFactory 是一個對資料庫的連線池,所以它佔據著資料庫的連線資源。如果建立多個 sqlSessionFactory,那麼就存在多個數據庫連線池,這樣不利於對資料庫資源的控制,也會導致資料庫連線資源被消耗光,出現宕機等情況,所以儘量避免發生這樣的情況。因此在一般的應用中我們往往希望 SqlSessionFactory 作為一個單例,讓它在應用中被共享。

三、SqlSession

如果說 SqlSessionFactory 相當於資料庫連線池,那麼 SqlSession 就相當於一個數據庫連線(Connection 物件),你可以在一個事務裡面執行多條 SQL,然後通過它的 commit、rollback 等方法,提交或回滾事務。所以它應該存活在一個業務請求中,處理完整個請求後,應該關閉這條連線,讓它歸還給 SqlSessionFactory ,否則資料庫資源就很快被消耗完,系統就會癱瘓,所以用 try...catch...finally...語句來保證其正確關閉。

四、Mapper

Mapper 是一個介面,它由 SqlSession 所建立,所以它的最大生命週期至多和 SqlSession 保持一致,儘管它很好用,但是由於 SqlSession 的關閉,它的資料庫連線資源也會消失,所以它的生命週期應該小於等於 SqlSession 的生命週期。Mapper 代表的是一個請求中的業務處理,所以它應該在一個請求中,一旦處理完了相關的業務,就應該廢棄它。