MyBatis元件的生命週期
SQLSessionFactoryBuilder
SQLSessionFactoryBuilder是利用XML或者Java編碼獲得資源來構建SqlSessionFactory的,通過它可以構建多個SessionFactory。它的作用就是一個構建器,一旦構建了SqlSessionFactory,它的作用就已經完結,失去了存在的意義,這時我們就應該毫不猶豫的廢棄它,將它回收。所以它的生命週期只存在於方法的區域性,它的作用是生成SqlSessionFactory物件。
SqlSessionFactory
SqlSessionFactory的作用是建立SqlSession。每次應用程式需要訪問資料庫,我們就要通過SqlSessionFactory建立SqlSession,所以SqlSessionFactory應該在MyBatis應用的整個生命週期中。而如果我們多次建立同一個資料庫的SqlSessionFactory,則每次建立SqlSessionFactory會開啟更多的資料庫連線,那麼連線資源就很快被耗盡,因此SqlSessionFactory的責任是唯一的,它的責任就是建立SqlSession,所以我們採用單例模式。
SqlSession
SqlSession是一個會話,它的生命週期應該在請求資料庫處理事務的過程中。它是一個執行緒不安全的物件。每次建立的SqlSession都必須及時關閉它,它長期存在就會使資料庫連線池的活動資源減少,對系統的效能影響很大。因此常在finally塊關閉SqlSession。它存活於一個應用的請求和操作,可以執行多條SQL,保證事務的一致性。
Mapper
Mapper是一個介面,而沒有任何實現類,它的作用是傳送SQL,然後返回我們需要的結果,或者執行SQL從而修改資料庫的資料,因此它應該在一個SqlSession事務方法之內,是一個方法級別的東西。
以下是建立SqlSessionFactory以及SqlSession的方法:
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory = null;
private SqlSessionFactoryUtil() {
}
//雙重檢查方式實現單例
public static SqlSessionFactory getInstance() {
String resource = "mybatis-config.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
if (sqlSessionFactory == null) {
// 添加了一個類鎖
synchronized (SqlSessionFactoryUtil.class) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return sqlSessionFactory;
}
/**
* 開啟SqlSession
*/
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
sqlSessionFactory = getInstance();
}
return sqlSessionFactory.openSession();
}
}
參考文獻:
深入淺出MyBatis技術原理與實戰