作用域和生命周期
理解到目前為止所討論的類的作用域和生命周期是非常重要的。如果使用不當可導致嚴重的並發性問題。
SqlSessionFactoryBuilder
這個類可以在任何時候被實例化、使用和銷毀。一旦您創造了SqlSessionFactory 就不需要
再保留它了。所以SqlSessionFactoryBuilder 實例的最好的作用域是方法體內(即一個本地方法
變量)。您能重用SqlSessionFactoryBuilder 創建多個SqlSessionFactory 實例,但最好不要把
時間、資源放在解析XML 文件上,而是要從中解放出來做最重要事情。
SqlSessionFactory
SqlSessionFactory
一旦創建,SqlSessionFactory 將會存在於您的應用程序整個運行生命周期中。很少或根本
冇有理由去銷毀它或重新創建它。最佳實踐是不要在一個應用中多次創建SqlSessionFactory。
這樣做會被視為“冇品味”。所是SqlSessionFactory 最好的作用域範圍是一個應用的生命周期
範圍。這可以由多種方式來實現,最簡單的方式是使用Singleton 模式或靜態Singleton 模式。
但這不是被廣泛接受的最佳做法,相反,您可能更願意使用像Google Guice 或Spring 的依賴注
入方式。這些框架允許您創造一個管理器,用於管理SqlSessionFactory 的生命周期。
SqlSession
SqlSession
每個線程都有一個SqlSession 實例,SqlSession 實例是不被共享的,並且不是線程安全
的。因此最好的作用域是request 或者method。決不要用一個靜態字段或者一個類的實例字段來
保存SqlSession 實例引用。也不要用任何一個管理作用域,如Servlet 框架中的HttpSession,
來保存SqlSession 的引用。如果您正在用一個WEB 框架,可以把SqlSession 的作用域看作類似
於HTTP 的請求範圍。也就是說,在收到一個HTTP 請求,您可以打開一個SqlSession,當您把
response 返回時,就可以把SqlSession 關閉。關閉會話是非常重要的,您應該要確保會話在一
個finally 塊中被關閉。
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }
在您的代碼裡都使用這一模式將保證所有的數據庫資源被正確地關閉(假如您冇有把您自己
的數據庫連接傳遞給MyBatis 管理,這就對MyBatis 表明您希望自己管理連接)。
Mapper 實例
Mapper 實例
Mappers 是創建來綁定映射語句的接口,該Mapper 實例是從SqlSession 得到的。因此,所
有mapper 實例的作用域跟創建它的SqlSession 一樣。但是,mapper 實例最好的作用域是
method,也就是它們應該在方法內被調用,使用完即被銷毀。並且mapper 實例不用顯式地被關
閉。雖然把mapper 實例保持在一個request 範圍(與SqlSession 相似)不會產生太大的問題,
但是您可能會發現,在這個層次上管理太多資源可能會失控。保持簡單,就是讓Mappers 保持在
一個方法內。下麵的例子演示了這種做法。
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }