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);
  // 你的应用逻辑代码
}
posted @ 2022-07-15 16:58  Oh,mydream!  阅读(31)  评论(0编辑  收藏  举报