Java SimpleHttpConnectionManager使用不正确,带有Objectify

Java SimpleHttpConnectionManager使用不正确,带有Objectify,java,google-app-engine,google-cloud-datastore,google-cloud-endpoints,objectify,Java,Google App Engine,Google Cloud Datastore,Google Cloud Endpoints,Objectify,我试图用Objectify保存多个数据存储实体,并不断收到数十条“SimpleHttpConnectionManager被错误使用”警告 我正在使用以下代码保存实体(我尝试过使用和不使用.now()调用): 此外,在前六次警告之后,我得到了以下例外情况: SEVERE: exception occurred while calling backend method com.google.appengine.tools.remoteapi.RemoteApiException: remote AP

我试图用Objectify保存多个数据存储实体,并不断收到数十条“SimpleHttpConnectionManager被错误使用”警告

我正在使用以下代码保存实体(我尝试过使用和不使用
.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
如果我遍历
实体
并单独保存每个实体,我不会收到任何警告,但这并不理想,因为多次调用数据存储的速度和成本都很高

我保存了大约2500个实体,并尝试将
实体
分为多个列表(1000项以下),但得到了相同的警告


这是客观化的问题还是我遗漏了一步?我是否应该完全不使用Objectify?

根据您提供的信息,有几件事您可以看一下,以解决您在数据存储方面的问题,因此让我来讨论一下所有这些问题:

  • ID生成:您使用哪种ID分配策略?请记住,如果您使用的是自动生成的@IDs,那么在使用异步保存(不使用
    .now()
    调用的调用)时必须这样做,因为它们不会自动填充实体实例上的ID值。所以在这种情况下,最好使用同步保存(使用
    .now()
    调用)来避免可能的问题。您还可以使用自己的ID分配,以避免操作在异步任务完成时挂起
  • 本地开发:在对您的问题的评论中,您提到该问题可能与本地开发服务器有关,因此了解您是否确实在使用
    开发应用服务器
    ,以及在这种情况下,您是否也在使用。这就引出了上一个主题,因为如果您使用的是本地数据存储仿真程序,并且希望获得自动生成的ID,则需要指定用于此类生成的策略
  • Objectify:我本人没有在Objectify第三方库中做过很多工作,但您需要了解的一件重要事情是,因此Objectify实例应该从单个线程中使用。然后,您需要确认正在使用的AppEngine应用程序不是线程安全的,并且没有使用来自不同线程的同一Objectify实例,因为这可能会导致错误。请注意,云平台不支持Objectify库(作为第三方库),其使用仅作为参考,因此,如果您对它一直存在问题,我建议您转到的替代方案之一,这将带我们到最后一点
  • 数据存储API和客户端库:这是两个受谷歌支持的备选方案,可用于从AppEngine连接到数据存储。数据存储API提供了对实体进行操作的方法。您可以使用它在同一调用中插入实体列表。最后,Java的提供了插入单个实体或它们的批的方法(尽管它仅适用于Java8)

因此,让我总结一下,让我把一切都弄清楚:首先,确认您是在本地运行应用程序还是在使用AppEngine的生产环境中运行应用程序(然后确认您是否使用emulator进行数据存储);然后,检查您的ID生成策略和调用类型(同步或异步),以及它们如何适应您的环境;最后,如果你一直对ObjyType有问题,考虑一下谷歌所支持的其他备选方案。

< P>用你提供的信息,有几个事情你可以看一下,以便解决数据存储中的问题,所以让我把所有的内容都看一遍:

  • ID生成:您使用哪种ID分配策略?请记住,如果您使用的是自动生成的@IDs,那么在使用异步保存(不使用
    .now()
    调用的调用)时必须这样做,因为它们不会自动填充实体实例上的ID值。所以在这种情况下,最好使用同步保存(使用
    .now()
    调用)来避免可能的问题。您还可以使用自己的ID分配,以避免操作在异步任务完成时挂起
  • 本地开发:在对您的问题的评论中,您提到该问题可能与本地开发服务器有关,因此了解您是否确实在使用
    开发应用服务器
    ,以及在这种情况下,您是否也在使用。这就引出了上一个主题,因为如果您使用的是本地数据存储仿真程序,并且希望获得自动生成的ID,则需要指定用于此类生成的策略
  • Objectify:我本人没有在Objectify第三方库中做过很多工作,但您需要了解的一件重要事情是,因此Objectify实例应该从单个线程中使用。然后,您需要确认正在使用的AppEngine应用程序不是线程安全的,并且没有使用来自不同线程的同一Objectify实例,因为这可能会导致错误。请注意,云平台不支持Objectify库(作为第三方库),其使用仅作为参考,因此,如果您对它一直存在问题,我建议您转到的替代方案之一,这将带我们到最后一点
  • 数据存储API和客户端库:这是两个受谷歌支持的备选方案,可用于从AppEngine连接到数据存储。数据存储API提供了对实体进行操作的方法。您可以使用它在同一调用中插入实体列表。最后,Java的提供了插入单个实体或它们的批的方法(
    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