Java 如何防止对单个JDO查询execute()进行多个RPC RunQuery调用?

Java 如何防止对单个JDO查询execute()进行多个RPC RunQuery调用?,java,google-app-engine,jdo,datanucleus,appstats,Java,Google App Engine,Jdo,Datanucleus,Appstats,我已经在Java Appengine应用程序上配置了Appstats,并注意到返回多个对象的单个JDO查询会导致对查询检索到的每个对象进行单独的RunQuery RPC调用 查询不应该在单个RPC调用中完成吗 我尝试过配置Fetchgroups和Fetchplans来避免这种情况,但没有效果 我的代码是这样的: Query query = pm.newQuery(WidgetDSO.class); String filter = "widgetId == param1 || widgetId

我已经在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()) 
...
每个调用的堆栈跟踪都是相同的(只是部分堆栈跟踪):


有没有一种方法可以在一次调用中获取所有对象?

这就是您的确切代码?如果是这样,我希望至少有3个查询。数据存储中没有本机“| |”(“或”)查询。JDO被迫将您的查询转换为每个选项的一个查询。有关更多信息,请参阅和相关的。 它不是直接声明的-您需要将| |转换为.contains(),而.contains()需要多个get

||只有在它分离的过滤器可以被分离的情况下才是合法的 合并到单个contains()筛选器中:

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

@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()