查询Google App Engine数据存储区时出现并发问题

时间:2017-01-03 20:20:59

标签: java multithreading google-app-engine concurrency

我的应用程序目前面临一个问题,即竞争条件有时会导致多个线程将相同的值写入数据存储区。

伪代码如下所示:

public void writeToDatastore(ValueObject obj){
   boolean objectExists = checkDatastoreForObject(obj);

   if(!objectExists){
      doSomeStuff();
      writeObjectToDatastore(obj);
   }
}

有时,在编写任何内容之前,有两个或多个线程从数据存储区读取,这会导致持久存在多个对象实例。

添加synchronized关键字(或其他并发构造)可以解决问题 - 前提是只有一个应用程序实例在运行。

如何在分布式环境中解决这些类型的并发问题?

2 个答案:

答案 0 :(得分:1)

从App Engine调用数据存储时,请使用事务。首先尝试获取()实体以查看它是否存在。如果没有,请把()实体。

以下是使用App Engine API演示交易的示例代码:https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/appengine/datastore/src/test/java/com/example/appengine/TransactionsTest.java

答案 1 :(得分:0)

请参阅:https://cloud.google.com/appengine/articles/scaling/contention

  

避免数据存储争用 - 当a时发生数据存储争用   单个实体或实体组更新太快。数据存储区   将并发请求排队等待轮到他们。请求等待   超过超时期限的队列将引发并发异常。   如果您希望更新单个实体或写入实体   每秒组数次超过几次,最好重新工作   尽早设计,以避免一旦您的申请可能发生争用   展开。