Mybatis系列--05-作用域和生命周期
作用域和生命周期
概述
本文主要讲SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession三个类对象的作用域和生命周期,如果使用错误会导致严重的并发问题,详见官网
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是用来构建SqlSessionFactory的,一旦SqlSessionFactory被创建,Builder就不在需要了,所以SqlSessionFactoryBuilder最佳作用域是方法作用域(即局部方法变量)。
SqlSessionFactory
SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由求其它或者新创建另一个实例,因此SqlSessionFactory的最佳作用域是应用作用域,最简单的是单例模式或者静态单例模式
SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession实例不是线程安全的,因此不能被共享,所以它的最佳作用域是请求作用域或方法作用域。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标准模式:
try (SqlSession session = sqlSessionFactory.openSession()) {
// 你的应用逻辑代码
}
映射器实例
映射器是一些绑定映射语句的接口。映射器实例最好放在方法作用于内。
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// 你的应用逻辑代码
}