【问题标题】:AppEngine - Optimize read/write count on POST requestAppEngine - 优化 POST 请求的读/写计数
【发布时间】:2012-05-31 07:20:41
【问题描述】:

我需要优化我正在使用的 POST 请求的读/写计数。

关于请求的一些信息:

  • 用户发送一个包含约 100 个项目的 JSON 数组
  • servlet 需要使用单个 long 属性检查接收到的任何项目是否比数据存储中的对应项更新
  • 我正在使用 JDO

我目前做的是(伪代码):

 foreach(item : json.items) {
     storedItem = persistenceManager.getObjectById(item.key);
     if(item.long > storedItem.long) {
         // Update storedItem
     }
 }

这显然会导致每个请求约 100 个读取请求。

减少此逻辑的读取计数的最佳方法是什么?使用 JDO Query?我读到使用“IN”-查询只会导致多个查询一个接一个地执行,所以我认为这对我没有帮助:(

还有PersistenceManager.getObjectsById(Collection)。这有什么帮助吗?找不到任何文档说明这将发出多少请求。

【问题讨论】:

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


    【解决方案1】:

    我认为您可以使用以下调用进行批量获取:

    Query q = pm.newQuery("select from " + Content.class.getName() + " where contentKey == :contentKeys");   
    

    上面的查询会返回你需要的所有对象。 您可以从这里处理所有其他事情。

    【讨论】:

    • 显然这不是你引用的“低级 API”
    • 刚刚用 appstats 工具检查过,结果是 ONE datastored get call :)
    • 是的,我认为@DataNucleus 是对的。我一直是这样想的……谢谢你指出来。
    【解决方案2】:

    最好的选择是

    pm.getObjectsById(ids);
    

    因为这是为了在调用中获取多个对象(特别是因为你有 id,因此有键)。当然,当前代码(2.0.1 和更高版本)应该为 getEntities() 执行单个数据存储调用。见this issue

    【讨论】:

    • 这个 getObjectsById 调用实际上是做什么的?它是批量获取还是为每个 id 做 getObjectById?
    • “当然,当前代码(2.0.1 及更高版本)应该为 getEntities() 执行单个数据存储调用”。显然你可以很容易地阅读日志来确认这些事情
    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2017-08-06
    • 2015-08-02
    相关资源
    最近更新 更多