MyBatis 中 SqlSession 与 SqlSessionFactory 的生命周期

一、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请求/方法级别否每次数据库操作都创建新的

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注