题目
解释Hibernate中SessionFactory和Session的区别与作用
信息
- 类型:问答
- 难度:⭐
考点
Hibernate核心接口,SessionFactory作用,Session作用
快速回答
SessionFactory和Session是Hibernate的两个核心接口:
- SessionFactory:线程安全的重量级对象,是数据库配置的编译表示,通常整个应用只有一个实例
- Session:轻量级非线程安全对象,代表与数据库的一次操作会话,每次操作需新建
主要区别:
- SessionFactory初始化后不可变,Session每次操作后需要关闭
- SessionFactory创建Session实例,Session负责CRUD操作
- SessionFactory缓存SQL语句和映射元数据,Session缓存实体对象
1. 核心概念说明
SessionFactory:
- 是
org.hibernate.SessionFactory接口的实例 - 在应用启动时根据配置(hibernate.cfg.xml或注解)初始化
- 线程安全,多个线程可同时访问同一个实例
- 生命周期贯穿整个应用(通常伴随应用启动创建,关闭时销毁)
Session:
- 是
org.hibernate.Session接口的实例 - 通过SessionFactory的
openSession()方法创建 - 非线程安全,每个线程应使用独立Session实例
- 生命周期短暂(通常一个数据库事务或一个请求周期)
2. 代码示例
// 初始化SessionFactory(通常放在静态代码块中)
Configuration config = new Configuration().configure();
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(registry);
// 使用Session操作数据库
try (Session session = sessionFactory.openSession()) {
Transaction tx = session.beginTransaction();
// 执行CRUD操作(示例:查询用户)
User user = session.get(User.class, 1L);
user.setName("Updated Name");
tx.commit();
} catch (Exception e) {
// 异常处理
}3. 核心作用对比
| SessionFactory | Session | |
|---|---|---|
| 主要职责 | 创建Session实例 | 执行数据库操作 |
| 线程安全 | 是(重量级) | 否(轻量级) |
| 缓存内容 | 二级缓存、SQL语句、元数据 | 一级缓存(实体对象) |
| 生命周期 | 应用级(长期) | 请求/事务级(短期) |
4. 最佳实践
- SessionFactory:
- 使用单例模式管理(Spring中配置为Bean)
- 避免重复创建(初始化消耗资源)
- Session:
- 遵循"open-session-per-request"模式
- 使用try-with-resources确保关闭(或finally块)
- 不要在多个线程间共享Session
5. 常见错误
- ❌ 在整个应用中只创建一个Session(导致并发问题和内存泄漏)
- ❌ 忘记关闭Session(造成数据库连接耗尽)
- ❌ 每次操作都创建新的SessionFactory(严重性能问题)
- ❌ 在多线程中共享Session(产生数据竞争)
6. 扩展知识
- 一级缓存:Session内置缓存,在事务内保证对象一致性
- 二级缓存:SessionFactory级别缓存,需额外配置(如Ehcache)
- 在Spring框架中:
LocalSessionFactoryBean管理SessionFactory@Transactional自动管理Session生命周期