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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章