在编程式使用的这个demo 里面,我们看到了MyBatis 里面的几个核心对象:SqlSessionFactoryBuiler、SqlSessionFactory、SqlSession 和Mapper 对象。这几个核心对象在MyBatis 的整个工作流程里面的不同环节发挥作用。如果说我们不用容器,自己去管理这些对象的话,我们必须思考一个问题:什么时候创建和销毁这些对象?
在一些分布式的应用里面,多线程高并发的场景中,如果要写出高效的代码,必须了解这四个对象的生命周期。这四个对象的声明周期的描述在官网上面也可以找到。
http://www.mybatis.org/mybatis-3/zh/getting-started.html
我们从每个对象的作用的角度来理解一下,只有理解了它们是干什么的,才知道什么时候应该创建,什么时候应该销毁。
1)SqlSessionFactoryBuiler
首先是SqlSessionFactoryBuiler 。它是用来构建SqlSessionFactory 的, 而SqlSessionFactory 只需要一个,所以只要构建了这一个SqlSessionFactory,它的使命就完成了,也就没有存在的意义了。所以它的生命周期只存在于方法的局部。
2)SqlSessionFactory
SqlSessionFactory 是用来创建SqlSession 的,每次应用程序访问数据库,都需要创建一个会话。因为我们一直有创建会话的需要,所以SqlSessionFactory 应该存在于应用的整个生命周期中(作用域是应用作用域)。创建SqlSession 只需要一个实例来做这件事就行了,否则会产生很多的混乱,和浪费资源。所以我们要采用单例模式。
3)SqlSession
SqlSession 是一个会话,因为它不是线程安全的,不能在线程间共享。所以我们在请求开始的时候创建一个SqlSession 对象,在请求结束或者说方法执行完毕的时候要及时关闭它(一次请求或者操作中)。
4)Mapper
Mapper(实际上是一个代理对象)是从SqlSession 中获取的。
BlogMapper mapper = session.getMapper(BlogMapper.class);
它的作用是发送SQL 来操作数据库的数据。它应该在一个SqlSession 事务方法之内。
最后总结如下:
对象 | 生命周期 |
SqlSessionFactoryBuiler | 方法局部(method) |
SqlSessionFactory(单例) | 应用级别(application) |
SqlSession | 请求和操作(request/method) |
Mapper | 方法(method) |
这个就是我们在编程式的使用里面看到的四个对象的生命周期的总结。