当hibernate关闭一个会话时,关闭的目的基本上是关闭底层连接和清理一级缓存。为什么刷新也不会在这里自动发生?
问问题
8420 次
1 回答
7
从事务的角度来看,刷新与关闭会话非常不同,flush
应该发生在事务的边界内(或commit
时间):
结束会话通常涉及四个不同的阶段:
- 刷新会话
- 提交事务
- 关闭会话
- 处理异常
另一方面,关闭会话(和底层连接)应该在事务结束后完成(关闭连接时待处理事务的行为 未定义)。
因此,没有理由在关闭时做任何事情并促进不良语义,并且具有不同的操作是完全合理的。
总结一下:
- 只需按照您的预期使用事务和适当的分界(如果需要,会话将在提交时刷新,具体取决于 FlushMode)。
- 使用
SessionFactory#getCurrentSession()
,你不必Session#close()
自己(Session
提交时会为你关闭)。
于 2009-12-28T12:23:09.297 回答