一、MyBatis 中 SqlSession 与 SqlSessionFactory 的生命周期
1. SqlSessionFactory
- 作用:MyBatis 的核心对象,用于创建
SqlSession实例。 - 创建方式:通过
SqlSessionFactoryBuilder读取配置文件(如conf.xml)构建。 - 生命周期:应用级别,单例。在应用启动时就创建,贯穿整个应用运行期间,不应被反复创建或销毁。
- 线程安全:
SqlSessionFactory是线程安全的,可以在多线程中共享同一个实例。
// 通常在应用初始化时创建一次,保存为全局变量
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);Code language: JavaScript (javascript)
2. SqlSession
- 作用:代表一次与数据库的交互会话,提供了操作数据库的所有方法(select、insert、update、delete 等)。
- 生命周期:请求/方法级别。每个线程/请求应有自己的
SqlSession,用完后必须关闭。 - 线程安全:
SqlSession不是线程安全的,不能被多个线程共享。 - 最佳实践:在
finally块中确保关闭,或使用 try-with-resources(MyBatis 3.2+ 支持SqlSession实现了AutoCloseable)。
// 正确用法:方法内创建,用完即关
SqlSession session = sessionFactory.openSession();
try {
// 执行数据库操作
Account account = session.selectOne("cn.foxdevelop.mapper.getAccount", 1);
} finally {
session.close();
}Code language: JavaScript (javascript)
3. 两者关系总结
| 对象 | 生命周期 | 线程安全 | 创建频率 |
|---|---|---|---|
SqlSessionFactory | 应用级别(全局单例) | 是 | 整个应用只创建一次 |
SqlSession | 请求/方法级别 | 否 | 每次数据库操作都创建新的 |
Previous: MyBatis 缓存介绍