Objectify 中的会话缓存不会因实体的更新而更新。 returns 只有陈旧的数据

Session cache in Objectify is not updated for update of the entity. It returns only the stale data

我正在 google appengine 中开发一个 We Maven 多模块项目。有3个模块。默认、后端和 api。 backend 和 api 是使用 objectify 存储数据的模块,默认包含前端代码。来自默认模块的所有与 Web 相关的请求都由后端模块处理并且运行良好。但是 api 模块是我面临的问题。一些数据通过 api 从外部应用程序推送,并使用 Objectify 在此应用程序中保存或更新。当我尝试获取相同内容以在之后的页面详细信息部分显示它时,将返回陈旧数据(未更新的数据)。当请求通过 UI.

时,我不会遇到这个问题

注意:1. 我在 web.xml 中为后端和 api 模块配置了 ObjectifyFilter。我相信,这会在更新/保存时进行清理工作。它是为应用程序中的所有端点配置的。 (/*)

  1. 这仅在该实体更新后发生。所有实体均已注册。

  2. 在 load() 之前使用 ofy.clear() 效果很好。我相信这会清除会话缓存。

  3. 过滤器顺序没有问题(除了 Objectify 过滤器之外还有一个额外的 Auth 过滤器。)。 ObjectifyFilter 优先,因为我在 AuthFilter 上面配置了。

  4. 我使用的是基本缩放,但后来在 Objectifyfilter 主题上看到一个 github 线程将其删除,但没有解决这个问题。

  5. 类似的问题在另一个地方弹出,但我将其作为单独的任务队列处理,因为它是一个依赖任务(在保存/更新另一个实体时触发)。但这是一个酉运算。

我现在使用的获取代码是

log.info("DAO :: fetch()");
        if(ofy.isLoaded(Key.create(Class.forName(className),key))) {
            log.info("session cache is loaded and key is present in it.");
            ofy.clear();
        }else {
            log.info("session cache is not loaded and key is not present in it. ==========> ofy.clear()");
        }
        entity = (DAO) ofy.load().type(Class.forName(className)).id(key).now();

会话缓存总是returns会话的当前内容。您需要在工作时了解会话的范围 - 如果您使用 ObjectifyFilter,默认情况下您有一个用于单个请求的会话缓存。您可以通过 运行 ObjectifyService.run() 或启动事务来创建新的会话范围。会话 single-threaded,仅与单个执行线程相关,应为 short-lived.

如果您试图让多个进程或执行线程以有意义的方式与公共数据交互,您可能需要事务。事务是保证数据存储中数据的一致视图的唯一方法——即使没有会话缓存,数据在您读取它的那一刻就已经过时了(其他人可能在一纳秒后更改了它)。交易解决了这个问题。