SimpleHttpConnectionManager被错误地使用了Objectify

时间:2017-12-17 18:04:35

标签: java google-app-engine google-cloud-datastore google-cloud-endpoints objectify

我正在尝试使用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吗?

2 个答案:

答案 0 :(得分:1)

根据您提供的信息,您可以通过以下几种方式查看数据存储的问题,让我回顾一下所有这些:

  • ID生成:您使用的ID分配策略是什么?请记住,如果您使用自动生成的@IDs ,则在使用异步保存(没有.now()调用的呼叫)时必须pay special attention,因为它们不会自动填充实体实例上的ID值。因此,在这种情况下,您应该更好地使用同步保存(使用.now()调用)以避免可能的问题。您还可以使用自己的ID分配,以避免等待完成异步任务的操作。
  • 本地开发:在您的问题评论中,您提到该问题可能与本地开发服务器有关,因此了解您是否确实使用{{1}会很有趣在这种情况下,如果您正在使用local Datastore emulator。这将我们带到上一个主题,因为如果您使用本地数据存储模拟器并期望获得自动生成的ID,则需要指定用于此类生成的策略。
  • Objectify :我自己对Objectify第三方库没有多少工作,但你需要知道的一件重要事情是it is not thread-safe,所以Objectify实例应该是从单个线程使用。然后,您需要确认您正在使用的AppEngine应用程序不是线程安全的,并且没有使用来自不同线程的相同Objectify实例,因为这可能会导致错误。请注意,Cloud Platform不支持​​Objectify库(作为第三方库),并且仅将其用作参考,因此如果您一直遇到问题,我建议您转到其中一个connecting to Datastore from AppEngine的替代方案,它将我们带到了最后一点。
  • 数据存储区API和客户端库:这些是Google支持的两种替代方案,可用于从AppEngine连接到数据存储区。 数据存储API 提供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问题”。