【问题标题】:Hibernate + Spring + session + cacheHibernate + Spring + session + 缓存
【发布时间】:2012-07-01 16:29:10
【问题描述】:

我们在 Java 应用程序中使用带有 Spring 的 Hibernate。我们发现当一个会话更新数据库中的某些内容时,其他会话看不到更新。 例如 user1 从数据库中获取账户余额,然后 user2 增加余额,如果 user1 再次获取对象,他在更新之前看到账户余额(似乎会话使用其缓存中的值)但我们想用 new 获取更新后的对象账户余额。 用户 1 在与用户 2 会话不同的所有活动中使用一个会话。 是否有任何配置强制从数据库中获取更新的对象?或任何其他帮助?

【问题讨论】:

  • 提交您使用 DB 执行的每个事务。
  • 请在打开/关闭、两个客户端的选择/更新/插入时间以及您使用的事务隔离级别方面更具体地说明事务/会话边界。

标签: java spring hibernate session caching


【解决方案1】:

如果您对所有活动使用单个会话,那么您所看到的就是预期的。

会话 1 将加载对象,然后由会话 2 更改。但是,会话 1 仍然打开,对象在会话(第一级)缓存中。您可以使用session.clear() 刷新 Session1,然后如果您重新加载对象,您将获得更新的版本。

【讨论】:

  • 在您建议的情况下,Alex 最后的陈述是不准确的,因为他们刚刚清除()帐户的旧状态并从数据库中重新加载它使用新版本
  • 对不起。这是基于他们在没有重新加载的情况下共享同一个对象的一个​​旁白。我应该清楚的。
  • 我已将其删除,因为它并没有增加任何价值!
【解决方案2】:

这是设计使然(将 Session 视为“工作单元”);会话应该是事务隔离的。这是会话应该短暂存在的众多原因之一。在我看来,您可能正在使用长寿命会话。

但无论如何,您都可以使用session.refresh( theAccount ); 强制“其他会话”(在您的情况下为 user1)刷新其帐户状态。 REFRESH 也是一个级联动作,如果您在刷新帐户时也需要刷新依赖状态...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 2012-12-12
    • 1970-01-01
    • 2012-04-09
    • 2021-05-09
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多