我的应用程序目前面临一个问题,即竞争条件有时会导致多个线程将相同的值写入数据存储区。
伪代码如下所示:
public void writeToDatastore(ValueObject obj){
boolean objectExists = checkDatastoreForObject(obj);
if(!objectExists){
doSomeStuff();
writeObjectToDatastore(obj);
}
}
有时,在编写任何内容之前,有两个或多个线程从数据存储区读取,这会导致持久存在多个对象实例。
添加synchronized
关键字(或其他并发构造)可以解决问题 - 前提是只有一个应用程序实例在运行。
如何在分布式环境中解决这些类型的并发问题?
答案 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时发生数据存储争用 单个实体或实体组更新太快。数据存储区 将并发请求排队等待轮到他们。请求等待 超过超时期限的队列将引发并发异常。 如果您希望更新单个实体或写入实体 每秒组数次超过几次,最好重新工作 尽早设计,以避免一旦您的申请可能发生争用 展开。