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技术原理与实战

猜你喜欢

转载自blog.csdn.net/zyxwvuuvwxyz/article/details/79645612