备注:如果使用了依赖注入的框架,那么就不需要自己明确关注这几个类的生命周期。
- SqlSessionFactoryBuilder:这个类是用来创建SqlSessionFactory实例的,创建完成以后就可以扔掉,没有必要继续保留。因此SqlSessionFactoryBuilder 实例最好的范围是函数范围(即作为一个函数的局部变量)。
- SqlSessionFactory:一旦创建,SqlSessionFactory实例就需要在应用的的执行期间存在。好的实践是在应用运行期间不要重复创建多个SqlSessionFactory实例。因此SqlSessionFactory实例最好的范围是应用的范围,例如,可以通过单列模式(Singleton pattern)来创建SqlSessionFactory的实例。
- SqlSession:每个线程应该有自己的SqlSession实例。在线程之间共享SqlSession实例不是线程安全的。因此SqlSession最好的范围是请求(request )或者方法范围。不要在一个静态属性、甚至实例属性中引用SqlSession的实例。不要在任何管理范围(managed scope)引用SqlSession的实例,例如HttpSession。对于HTTP的处理,可以在收到http请求以后,创建一个SqlSession实例,返回http响应以后,关闭SqlSession。关闭可以采用如下的语法:
try (SqlSession session = sqlSessionFactory.openSession()) {
// do work
}
- Mapper 实例:Mapper 是接口,用来绑定到映射声明(mapped statements),通过SqlSession来获得。因此,从技术上说,Mapper 实例的最大范围和SqlSession的范围相同。但是,Mapper 实例最好的范围是方法范围。Mapper 实例不需要显式关闭。例如:
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
}