GAE中与Objectify的并发性

时间:2012-07-05 11:10:49

标签: google-app-engine concurrency objectify

我创建了一个测试Web应用程序来测试Entities的persist-read-delete,我创建了一个简单的循环来持久化Entity,检索并修改它然后将其删除100次。

在循环的某个时间间隔没有问题,但是有一些错误,Entity已经存在,因此无法持久存在(我添加的自定义异常处理)。

同样在循环的某个时间间隔,Entity无法修改,因为它不存在,最后在某个时间间隔内Entity无法删除,因为它不存在。

我知道循环可能太快,以至于Appengine数据存储区的操作尚未完成。因此,在尝试访问它或删除操作时导致Entity does not exist之类的错误尚未完成,因此无法创建具有相同ID的实体,等等。

但是,我想了解如何处理使用Entity进行并发操作的这种情况。

1 个答案:

答案 0 :(得分:1)

根据我的理解,你做的事情如下:

for i in range(0,100):
    ent = My_Entity()    # create and save entity
    db.put(ent)
    ent = db.get(ent.key())   # get, modify and save the entity
    ent.property = 'foo'
    db.put(ent)
    ent.get(ent.key())  # get and delete the entity
    db.delete(my_ent)

进行一些错误检查以确保您有要删除,修改的实体,并且您遇到了一堆关于查找要删除或修改的实体的错误。如你所说,这是因为不能保证按顺序执行调用。

  

但是,我想了解如何处理这种与实体进行并发操作的情况。

您最好的选择是批量执行您为实体持久化所做的任何修改。例如,如果您要创建/保存/修改/节省或修改/保存/删除尽可能尝试组合这些步骤(即创建/修改/保存或修改/删除)。这不仅可以避免您看到的错误,还可以减少您的RPC。遵循这一策略,上述循环将减少为......

prop = None
for i in range(0,100):
    prop = 'foo'

换句话说,对于任何需要设置/删除的东西,只需使用局部变量即可。那是GAE给你的答案。在弄清楚所有快速的东西后,你无法在实体中保留这些信息。

除此之外,您无能为力。如果您需要确保一组实体一起更新,Transactions可以帮助您,但如果您尝试将多个内容同时添加到一个实体,则无法提供帮助。

编辑:您还可以查看pipelines API