【问题标题】:How to avoid inconsistent state entities in the Objectify cache?如何避免 Objectify 缓存中的状态实体不一致?
【发布时间】:2013-02-23 22:57:50
【问题描述】:

在我的模型中,我有一些更复杂并且可以抛出异常的方法。当这些异常发生时,它们会使模型处于不一致的状态。到目前为止,这种情况从未成为问题,因为控制器意识到了这种行为并且从未在数据存储中使用/保留不一致的实体 - 该模型的实例通常单独留给垃圾收集器。

然而,在阅读 Objectify 的文档时,我注意到会话缓存包含返回给应用程序的完全相同的 Java 对象。这种行为会破坏我对丢弃不一致实体的假设吗?

这是预期的行为吗?从现在开始,无论如何,我必须始终让我的所有模型实例保持一致状态。因为它们都可以隐式保存在缓存中。如果是这种情况,我必须检查所有抛出异常的方法,甚至是非检查异常,以确保我的模型实例始终保持一致和可用。

另外,这可能是多线程 Java 应用程序的问题吗?如果用户打开两个浏览器选项卡,并且碰巧发出两个请求,这两个请求将访问缓存中的同一对象。那可能吗?我是否需要让我的模型的所有类都是线程安全的?

你们如何解决这些问题?

谢谢。

【问题讨论】:

    标签: google-cloud-datastore objectify


    【解决方案1】:

    对象化会话!= 用户会话。 Ofy 会议是工作会议;它们不应该跨线程共享,应该在需要时创建和丢弃。它们在这方面类似于 JPA 会话。

    【讨论】:

    • 谢谢。。如果我将 ObjectifyFilter 与 ObjectifyService 中的静态 ofy() 方法一起使用,这个 session 会有请求的持续时间吗?
    • 是的,ofy() 将从请求范围的会话开始,并在您进行事务处理时通过事务正确管理它()。如果你真的想管理自己的会话,可以使用 factory().begin() 创建一个新会话。
    • 查看 ObjectifyService 的源代码 - 它的内容很少,如果您想要不同的设计模式,您可以轻松替换它。但永远不要跨线程共享会话。
    • 好的,非常感谢。我注意到您是 Objectify 的主要开发人员 - 这是一个了不起的库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2012-08-19
    相关资源
    最近更新 更多