在 Hibernate 中,flush
和 clear
是两个与 一级缓存(Session 缓存) 管理密切相关的方法,属于 Session
接口的重要操作。它们分别用于同步和清空持久化上下文。
一、flush()
是什么?
flush()
的作用是:
举例:
你调用了 session.save(entity)
,此时数据只是保存在 Hibernate 的内存中,并没有立即写入数据库。调用 flush()
后,Hibernate 会生成相应的 SQL 语句(如 INSERT
、UPDATE
、DELETE
)并发送给数据库执行。
何时使用 flush?
- 需要提前执行 SQL:比如在事务提交前你需要确保数据库已经更新(如为了后续的 SQL 查询能查到最新数据)。
- 执行原生 SQL 之前:Hibernate 不会自动 flush,所以如果你用原生 SQL 查询涉及刚刚修改过的数据,需要手动 flush。
- 批量更新场景中定期 flush 减少内存压力。
二、clear()
是什么?
clear()
的作用是:
清空当前 Session 的一级缓存(即持久化上下文),所有被缓存的对象变为游离状态(Detached)。
举例:
调用 clear()
后,Hibernate 不再跟踪 Session 中的所有实体对象。如果你修改这些对象的属性,Hibernate 不会再自动感知到变化,也不会自动同步到数据库。
何时使用 clear?
- 批量处理大数据量时:防止内存占用过高,比如每处理 100 条记录就
flush()
一次并clear()
一次。 - 避免缓存污染:某些场景下你可能不希望旧对象影响新事务。
三、结合使用的典型场景(伪代码):
for (int i = 0; i < entities.size(); i++) {
session.save(entities.get(i));
if (i % 50 == 0) {
session.flush(); // 写入数据库
session.clear(); // 清空缓存,防止内存占用过高
}
}
总结:
方法 | 作用 | 使用场景 |
---|---|---|
flush() | 将缓存同步到数据库,不提交事务 | 数据需要及时入库、执行原生 SQL 前、控制 SQL 执行顺序 |
clear() | 清空 Session 缓存,断开对象与 Session 的关联 | 批处理优化内存、避免旧对象干扰 |