1. 程式人生 > >MyBatis元件的生命週期

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技術原理與實戰