2009-12-01 103 views
0

修改第一级缓存的记录,我知道当我们做save​​orupdate时,我们需要调用flush()来刷新缓存,以便后续的数据库选择查询。因此,对于使用休眠的应用程序,我们不应该通过使用DB-GUI修改记录/删除记录,而不会通过休眠,因为select会因为缓存而查询错误的结果。正确?一级休眠缓存,直接在DB

回答

3

不正确。第一级缓存始终与自身保持一致,并与该会话中进行的更新保持一致。会议结束后,所有剩余的更新都会自动刷新,您很少必须自己拨打flush()

此外,第一级高速缓存只持续hibernate会话期间(通常只持续几个SQL语句,通常持续时间不到一秒),因此对数据库直接进行的任何更新都将会体现在下一次开始的hibernate会话中。

+0

对于二级缓存怎么样。我敢肯定,如果我直接在数据库中修改记录,hibernate应用程序仍然会从缓存中重新获取而不知道它? – cometta 2009-12-01 09:59:32

+1

是的,对L2高速缓存来说可能是正确的,但是你的问题是关于L1(会话)高速缓存。区分两者非常重要,行为是非常不同的。 – skaffman 2009-12-01 10:00:27

+0

而'CacheMode'就是这个。 – 2009-12-01 10:02:36

1

想象一下,如果FlushMode设置为Auto,则在进行任何可能已受影响的HQL或条件查询之前,应刷新它。如果您正在进行SQL查询(或者您在进行HQL查询并且FlushMode不是自动的),则需要刷新,否则当发生SQL查询时,更改不会反映在数据库中。

此外,如果您未使用事务,则需要在处理会话之前调用flush。

看看这个https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html