对于Google App Engine(java),如何在FetchOptions中设置和使用块大小?

joh*_*ley 10 java google-app-engine chunking google-cloud-datastore

我运行一个查询,它目前返回1400结果,因此我在日志文件中收到以下警告:

com.google.appengine.api.datastore.QueryResultsSourceImpl logChunkSizeWarning:此查询没有在FetchOptions中设置的块大小,并返回了超过1000个结果.如果此查询的结果集对此查询很常见,请考虑设置块大小以提高性能.

我找不到任何关于如何实际实现这个的例子,这里有关于python的问题,但是因为我使用java并且不理解python,我正在努力翻译它.

另外这个查询(下面)正在执行17226cpu_ms,这感觉太长了,我甚至无法想象如果我说5000个联系人需要在客户端搜索它们会发生什么(就像你使用googlemail联系人一样! )

我的代码是:

    int index=0;
    int numcontacts=0;
    String[][] DetailList;

    PersistenceManager pm = PMF.get().getPersistenceManager();


    try {
        Query query = pm.newQuery(Contact.class, "AdminID == AID");
        query.declareParameters("Long AID");
        query.setOrdering("Name asc");
        List<Contact> Contacts = (List<Contact>) query.execute(AdminID);
        numcontacts=Contacts.size();
        DetailList=new String[numcontacts][5];

        for (Contact contact : Contacts) 
        {
            DetailList[index][0]=contact.getID().toString();
            DetailList[index][1]=Encode.EncodeString(contact.getName());
            index++;
        }
    } finally {
        pm.close();
    }
    return (DetailList);
Run Code Online (Sandbox Code Playgroud)

我在这里找到了以下两个条目:

但实际上并未涉及有关如何实施或使用这些选项的任何细节.我猜它是一个服务器端进程,我猜你要设置某种循环来一次抓取一个块,但我该如何实际做到这一点?

  • 我是否在循环中调用查询?
  • 我怎么知道循环多少次?
  • 我只是检查第一个以小于块大小的条目数返回的块吗?

如果没有一个实际的例子,我是怎么想找到这样的东西呢?在我看来,这里的其他人似乎"只知道"该怎么做..!

抱歉,如果我没有以正确的方式提出问题,或者我只是一个愚蠢的新手,但我不知道还有什么可以解决这个问题!

elk*_*ine 4

遇到同样的问题,最后一条评论是一个月前的,所以这是我发现的关于繁重数据集查询的内容。

我想在阅读了谷歌文档文章中的这些行(顺便提到的 python 中的那一行)后,我将使用“查询游标”技术:

本文是为 SDK 版本 1.1.7 编写的。从版本 1.3.1 开始,查询游标 ( Java | Python ) 已经取代了下面描述的技术,并且现在是对大型数据集进行分页的推荐方法。

在关于“查询光标”的谷歌文档中。该文档的第一行准确地给出了为什么需要光标

查询游标允许应用程序执行查询并检索一批结果,然后在后续 Web请求中获取同一查询的其他结果,而无需查询偏移量的开销

该文档还提供了使用游标技术的 servlet 的java 示例。有一个提示如何为客户端生成安全游标。最后,暴露了游标的局限性。

希望这能为您解决问题提供线索。

关于 range 和offset的小提醒,如果忘记的话会对性能产生相当大的影响(我就是这么做的^^):

起始偏移量对性能有影响:数据存储区必须检索并丢弃起始偏移量之前的所有结果。例如,范围为 5、10 的查询从数据存储区获取十个结果,然后丢弃前五个结果并将剩余的五个结果返回给应用程序。


编辑:在使用 JDO 时,我一直在寻找一种方法,允许我以前的代码在单个查询中加载 1000 多个结果。所以,如果你也使用 JDO,我发现了这个老问题

Query query = pm.newQuery(...);
// I would use of value below 1000 (gae limit) 
query.getFetchPlan().setFetchSize(numberOfRecordByFetch); 
Run Code Online (Sandbox Code Playgroud)