sqlsessionfactory 是线程安全的全局单例,sqlsessionfactorybuilder 仅用于构建阶段且不可复用;应通过静态单例或 spring @bean 管理 sqlsessionfactory,避免重复构建,sqlsession 非线程安全需及时关闭。

MyBatis 的 SqlSessionFactory 是线程安全的,应作为全局单例存在;而 SqlSessionFactoryBuilder 仅用于构建阶段,用完即弃,不可复用或共享。
SqlSessionFactoryBuilder 的作用和生命周期
SqlSessionFactoryBuilder 是一个轻量级工具类,负责读取配置(XML 或 Java Config),解析后生成 SqlSessionFactory。它本身不保存状态,每次调用 build() 都会新建一个工厂实例。因此:
- 它不是单例,也不需要被保存
- 构建完成后应立即丢弃,不要缓存或重复使用
- 多次调用 build() 会产生多个独立的 SqlSessionFactory,违背“全局唯一”原则
从 XML 配置文件构建 SqlSessionFactory
典型做法是通过 Resources 工具加载 mybatis-config.xml,再交由 SqlSessionFactoryBuilder 解析:
- 确保配置文件在 classpath 下(如
src/main/resources/mybatis-config.xml) - 使用
Resources.getResourceAsStream()获取输入流 - 调用
new SqlSessionFactoryBuilder().build(inputStream) - 将返回的
SqlSessionFactory赋值给 static final 字段或交给 Spring 管理
保证全局唯一性的常见方式
手动管理时,推荐用静态内部类或枚举实现懒汉式单例:
- 定义
private static volatile SqlSessionFactory INSTANCE - 在静态方法中双重校验锁初始化,避免重复构建
- Spring 环境下直接用
@Bean声明SqlSessionFactory,容器自动保证单例 - 切勿在每次获取 Session 时都 new 一个
SqlSessionFactoryBuilder并调用build()
构建后如何获取 SqlSession
SqlSessionFactory 创建成功后,业务代码通过它获取 SqlSession:
- 调用
openSession()得到非自动提交的 session - 或用
openSession(true)开启自动提交(适合只读场景) -
SqlSession非线程安全,用完必须close(),建议配合 try-with-resources
不复杂但容易忽略:SqlSessionFactoryBuilder 只是“造工厂的锤子”,锤子可以有很多把,但工厂只能有一个。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











