gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:53 25 4
gpt4 key购买 nike

我已经在我的 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()

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

最佳答案

这是您的确切代码吗?如果是这样,我希望至少有 3 个查询,最少。没有原生的“||” ("OR") 在数据存储中查询。 JDO 被迫将您的查询转换为每个选项的一个查询。有关详细信息,请参阅 docs和相关的blog post .它没有直接说明 - 您需要将 || 转换为 .contains() 的事实结合起来,而 .contains() 需要多次获取。

|| is only legal in situations where the filters it separates can be combined into a single contains() filter:

The contains() operator also performs multiple queries, one for each item in the provided list value where all other filters are the same and the contains() filter is replaced with an equal-to filter.

关于java - 如何防止对单个 JDO 查询 execute() 进行多次 RPC RunQuery 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com