Hibernate多用户环境

Hibernate多用户环境,hibernate,session,Hibernate,Session,考虑这样一种情况:用户1使用hibernate(获取或加载或从customer where name=“gkp”)通过整个应用程序查询数据库,然后DBA通过在db中执行更新查询来手动更新该特定行。如果第二个用户执行相同的查询,他将获得更新的数据还是旧的数据(用户1看到的) hibernate是否将结果存储在会话中并返回给第二个用户。实际情况如何?如果启用了二级缓存,第二个用户将获得一个包含旧数据的对象,如果未启用,则会获得一个包含新数据的对象。当然,除非他们使用相同的ISession实例,否则这

考虑这样一种情况:用户1使用hibernate(获取或加载或从customer where name=“gkp”)通过整个应用程序查询数据库,然后DBA通过在db中执行更新查询来手动更新该特定行。如果第二个用户执行相同的查询,他将获得更新的数据还是旧的数据(用户1看到的)


hibernate是否将结果存储在会话中并返回给第二个用户。实际情况如何?

如果启用了二级缓存,第二个用户将获得一个包含旧数据的对象,如果未启用,则会获得一个包含新数据的对象。当然,除非他们使用相同的ISession实例,否则这是不可取的

第一级缓存位于会话级别;第二级缓存位于会话工厂级别。如果您有直接而不是通过NHibernate进行的更新,则两级缓存都不会获取更新,因此如果您正在访问缓存(在打开不同会话和第二级缓存的情况下,或者通过使用同一会话),您将看不到所做的更改


在这些场景中,使用某种版本列(例如SQL Server时间戳、Oracle ORA_SCN)通常是有意义的和乐观脱机锁定,以防止对实体进行更新,而该实体实际上已被另一个进程更新。

如果启用了二级缓存,则第二个用户将获得一个包含旧数据的对象,如果未启用二级缓存,则会获得一个包含新数据的对象。当然,除非他们使用的是相同的ISession实例这样做是不可取的

第一级缓存位于会话级别;第二级缓存位于会话工厂级别。如果您有直接而不是通过NHibernate进行的更新,则两级缓存都不会获取更新,因此如果您正在访问缓存(在打开不同会话和第二级缓存的情况下,或者通过使用同一会话),您将看不到所做的更改


在这些场景中,使用某种版本列(例如SQL Server时间戳、Oracle ORA_SCN)通常是有意义的和乐观脱机锁定,以防止对实体进行更新,而实体实际上已被另一个进程更新。

谢谢您的解释,但这有点令人困惑//如果启用了二级缓存,第二个用户将获得旧的,如果未启用,将获得一个新的//您的意思是什么//如果未启用,将获得一个新的i don’我的意思是,如果我使用一级缓存,那么第二个用户就会得到更新的值?如果这是我想说的重点,那么为什么会出现这种情况//如果你的更新是直接进行的,而不是通过NHibernate进行的,那么这两个级别的缓存都不会得到更新。你能清楚地告诉我吗..我可以认为版本控制是一种选择,但是当我看到这个问题时,我最初的想法是“每个用户都有单独的会话,那么就没有机会使用相同的会话(第一级缓存),第二级缓存也不可能,所以只有一个解决方案是版本控制”如果我错了,请纠正我。如果您所处的环境使用的是NHibernate,但某些数据更新不是通过NHibernate执行的,并且您希望用户无法保存对自首次获取以来已更新的行的更改,那么是的,版本控制绝对是您唯一的选择。感谢您的解释在上,但有点令人困惑//如果启用了二级缓存,第二个用户将得到旧的,如果未启用,则得到一个新的//您所说的//是什么意思,如果未启用,则得到一个新的???这是否意味着如果我使用一级缓存,则第二个用户将得到更新的值?如果这是您试图说的重点,那么为什么会这样做//如果您有更新这是直接生成的,而不是通过NHibernate生成的,它们不会被任何级别的缓存获取。请您清楚地告诉我。我可以认为版本控制是一种选择,但当我看到这个问题时,我最初的想法是“每个用户都有单独的会话,那么就没有机会使用相同的会话。”(第一级缓存),第二级也不可能,因此只有一个解决方案是版本控制”如果我错了,请纠正我。如果您所处的环境使用的是NHibernate,但某些数据更新不是通过NHibernate执行的,并且您希望用户无法保存对自首次获取以来已更新的行的更改,那么是的,版本控制绝对是您唯一的选择。