3

我已经在我的 Java Appengine 应用程序上配置了 Appstats,并注意到返回多个对象的单个 JDO 查询会导致查询检索到的每个对象的单独 RunQuery RPC 调用。

不应该在单个 RPC 调用中完成查询吗?

我尝试配置 Fetchgroups 和 Fetchplans 来避免这种情况,但无济于事。

我的代码是这样的:

Query query = pm.newQuery(WidgetDSO.class);

String filter = "widgetId == param1 || widgetId == param2 || widgetId == param3";
String parameters = "String param1, String param2, String param3";

query.setFilter(filter.toString());
query.declareParameters(parameters.toString());

List<WidgetDSO> results = (List<WidgetDSO>) query.executeWithArray(widgetIds);
if (!results.isEmpty()) 
...

当它运行时,Appstats 告诉我最后一行results.isEmpty()导致的 RPC 调用与检索到的对象一样多:

@104ms datastore_v3.RunQuery real=5ms api=21ms
@422ms datastore_v3.RunQuery real=4ms api=12ms
@428ms datastore_v3.RunQuery real=4ms api=12ms
@434ms datastore_v3.RunQuery real=3ms api=12ms
@439ms datastore_v3.RunQuery real=4ms api=12ms
@445ms datastore_v3.RunQuery real=4ms api=12ms
@451ms datastore_v3.RunQuery real=4ms api=21ms
@463ms datastore_v3.RunQuery real=5ms api=21ms

每个调用的堆栈跟踪都是相同的(只是部分堆栈跟踪):

com.google.appengine.tools.appstats.Recorder:290 makeAsyncCall()
com.google.apphosting.api.ApiProxy:184 makeAsyncCall()
com.google.appengine.api.datastore.DatastoreApiHelper:81 makeAsyncCall()
com.google.appengine.api.datastore.PreparedQueryImpl:144 runQuery()
com.google.appengine.api.datastore.PreparedQueryImpl:70 asIterator()
com.google.appengine.api.datastore.PreparedMultiQuery$FilteredMultiQueryIterator:165 getNextIterator()
com.google.appengine.api.datastore.PreparedMultiQuery$FilteredMultiQueryIterator:184 computeNext()
com.google.appengine.api.datastore.PreparedMultiQuery$FilteredMultiQueryIterator:98 computeNext()
com.google.appengine.api.datastore.AbstractIterator:52 tryToComputeNext()
com.google.appengine.api.datastore.AbstractIterator:47 hasNext()
com.google.appengine.api.datastore.BasePreparedQuery$UncompilablePreparedQuery$1:86 hasNext()
org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator$1:50 get()
org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator$1:46 get()
org.datanucleus.store.appengine.query.QueryExceptionWrappers$1:51 get()
org.datanucleus.store.appengine.query.QueryExceptionWrappers$2:86 get()
org.datanucleus.store.appengine.query.RuntimeExceptionWrappingIterator:105 hasNext()
org.datanucleus.store.appengine.query.LazyResult:115 resolveAll()
org.datanucleus.store.appengine.query.LazyResult:110 size()
org.datanucleus.store.appengine.query.StreamingQueryResult:130 size()
org.datanucleus.store.query.AbstractQueryResult:312 isEmpty()
org.instantplaces.im.server.dso.WidgetDSO:209 getWidgetsFromDSO()
org.instantplaces.im.server.resource.WidgetResource:239 doDelete()
org.instantplaces.im.server.resource.GenericResource:244 delete()

有没有办法在一次调用中获取所有对象?

4

1 回答 1

2

那是你的确切代码吗?如果是这样,我希望至少有 3 个查询。没有原生的“||” (“或”)数据存储中的查询。JDO 被迫将您的查询转换为每个选项的一个查询。有关详细信息,请参阅文档和相关博客文章。它没有直接说明 - 您需要结合 || 转换为 .contains() 的事实,并且 .contains() 需要多次获取。

|| 只有在它分离的过滤器可以组合成一个 contains() 过滤器的情况下才合法:

contains() 运算符还执行多个查询,对提供的列表值中的每个项目执行一个查询,其中所有其他过滤器都相同,并且 contains() 过滤器被替换为等于过滤器。

于 2011-11-01T01:11:14.450 回答