【问题标题】:Using Objectify in long-running background tasks在长时间运行的后台任务中使用 Objectify
【发布时间】:2018-04-12 21:36:07
【问题描述】:

我计划使用 Objectify 与 GAE Flex 的 Cloud Datastore 对话。该应用程序将运行相当多的后台线程与 Datastore 对话,对此我有几个问题。

  • 我不打算使用任何 memcache 设置,因为这些线程将运行很长时间,我也不希望会话缓存被填满。我找不到将ofy() 设置为从不在本地缓存的方法,唯一的选择似乎是定期运行clear() 操作。有没有更好的方法来避免这些缓存?

  • 正如我所见,我们需要将任何此类ofy() 调用包装在run() 块中以执行清理。我想确认这是在请求范围之外使用它的唯一方法,并且没有对这些较长上下文的内置支持。

谢谢

【问题讨论】:

  • 如果您不打算使用任何缓存,为什么担心会话缓存已满?无论如何,这是一个最大的努力,免费的服务水平
  • 有一个特别提到这个缓存已满导致内存问题 - 它在内部是一个键值映射,这意味着如果在整个生命周期中维护相同的映射,它确实会导致问题.我可以定期运行 clear() 但似乎是一个 hack 和不必要的工作,因此我的问题是首先如何避免它,因为我不打算使用它。

标签: google-app-engine google-cloud-datastore objectify


【解决方案1】:

你是对的。 ObjectifyService.run() 是在 ObjectifyFilter 之外运行请求的方式。

目前没有任何方法可以禁用会话缓存。会话缓存非常深入地融入了 Objectify 的结构中,以便为@Load 操作获得理智的行为。这不是不可能的,只是还没有上升到优先级队列的顶部。

在不遇到内存问题的情况下迭代大量数据存储的最佳方法是迭代指定明确的chunk() 大小,然后在处理完该数量的项目后指定clear()。如果你使用 Guava 的 Iterators.partition(),这几乎是一个单行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2018-01-12
    • 1970-01-01
    • 2014-11-13
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多