我正在尝试使用Objectify保存多个数据存储区实体,并且不断收到数十个“SimpleHttpConnectionManager使用不正确”的警告。
我正在使用以下代码保存实体(我已尝试使用和不使用.now()
调用):
ofy().save().entities(entities).now();
此外,在大约上半打警告后,我得到以下例外:
SEVERE: exception occurred while calling backend method
com.google.appengine.tools.remoteapi.RemoteApiException: remote API call: I/O error
Caused by: java.net.SocketTimeoutException: Read timed out
如果我遍历entities
并单独保存每个实体,我不会收到任何警告,但由于多次调用数据存储区的速度和成本,这并不理想。
我正在保存大约2500个实体,并尝试将entities
分解为多个列表(1000个项目以下),但会收到相同的警告。
这是Objectify的问题还是我错过了一步?我根本不应该使用Objectify吗?
答案 0 :(得分:1)
根据您提供的信息,您可以通过以下几种方式查看数据存储的问题,让我回顾一下所有这些:
.now()
调用的呼叫)时必须pay special attention,因为它们不会自动填充实体实例上的ID值。因此,在这种情况下,您应该更好地使用同步保存(使用.now()
调用)以避免可能的问题。您还可以使用自己的ID分配,以避免等待完成异步任务的操作。commit
handler对实体进行操作。您可以使用它在同一个调用中插入实体列表。最后,Java的 Client Library 提供datastore.add()
method用于插入单个实体或批量实体(尽管它仅适用于Java 8)。因此,让我总结清楚一切:首先,确认您是在本地运行应用程序还是使用AppEngine在生产环境中运行应用程序(如果您正在使用数据存储区的模拟器,请确认);然后,检查您的ID生成策略和呼叫类型(同步或异步),以及它们如何适合您的环境;最后,如果您继续遇到Objectify问题,请考虑查看Google特别支持的其他替代方案。
答案 1 :(得分:1)
这与Objectify无关。 Objectify是一层薄薄的代码,可以将您的POJO映射到Google API使用的低级hashmap类对象。在大多数情况下,Objectify操作将1对1转换为低级API调用。
如果您使用低级API重写应用程序以执行相同的操作,您将看到完全相同的问题。具有RemoteApiException的堆栈跟踪来自Google的DatastoreService.put()
方法深处。
我认为你从开发服务器得到这个错误(服务器端很奇怪)。谷歌最近改写了应用程序引擎开发服务器,不幸的是,当出现问题时,它往往会产生这样的不透明错误。我会将此报告给Google作为错误 - 但请务必向他们提供完整的堆栈跟踪。在this page上向下滚动到“创建新的App Engine问题”。