MyBatis中對象的範圍和生命週期

【以下轉載自MyBatis3.2.3官方文檔】

理解我們目前已經討論過的不同範圍和生命週期類是很重要的。 不正確的使用它們會導 致嚴重的併發問題。

SqlSessionFactoryBuilder

這個類可以被實例化,使用和丟棄。一旦你創建了 SqlSessionFactory 後,這個類就不需 要存在了。 因此 SqlSessionFactoryBuilder 實例的最佳範圍是方法範圍 (也就是本地方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例, 但是最好的方式是 不需要保持它一直存在來保證所有 XML 解析資源,因爲還有更重要的事情要做。

SqlSessionFactory

一旦被創建,SqlSessionFactory 應該在你的應用執行期間都存在。沒有理由來處理或重 新創建它。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重複創建多次。 這樣的 操作將被視爲是非常糟糕的。 因此 SqlSessionFactory 的最佳範圍是應用範圍。 有很多方法可 以做到, 最簡單的就是使用單例模式或者靜態單例模式。

SqlSession

每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不能被共享,也是線程 不安全的。因此最佳的範圍是請求或方法範圍。絕對不能將 SqlSession 實例的引用放在一個 類的靜態字段甚至是實例字段中。 也絕不能將 SqlSession 實例的引用放在任何類型的管理範 圍中, 比如 Serlvet 架構中的 HttpSession。 如果你現在正用任意的 Web 框架, 要考慮 SqlSession 放在一個和 HTTP 請求對象相似的範圍內。換句話說,基於收到的 HTTP 請求,你可以打開 了一個 SqlSession,然後返回響應,就可以關閉它了。關閉 Session 很重要,你應該確保使 用 finally 塊來關閉它。下面的示例就是一個確保 SqlSession 關閉的基本模式:
SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}


 在你的代碼中一貫地使用這種模式, 將會保證所有數據庫資源都正確地關閉 (假設你沒有通過你自己的連接關閉,這會給 MyBatis 造成一種跡象表明你要自己管理連接資源) 。

Mapper 實例

映射器是你創建綁定映射語句的接口。映射器接口的實例可以從 SqlSession 中獲得。那 麼從技術上來說,當被請求時,任意映射器實例的最寬範圍和 SqlSession 是相同的。然而, 映射器實例的最佳範圍是方法範圍。也就是說,它們應該在使用它們的方法中被請求,然後 就拋棄掉。它們不需要明確地關閉,那麼在請求對象中保留它們也就不是什麼問題了,這和 SqlSession 相似。你也許會發現,在這個水平上管理太多的資源的話會失控。保持簡單,將 映射器放在方法範圍內。下面的示例就展示了這個實踐:
SqlSession session = sqlSessionFactory.openSession();
try {
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        // do work
} finally {
  session.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章