Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine GAE中与Objectify的并发性_Google App Engine_Concurrency_Objectify - Fatal编程技术网

Google app engine GAE中与Objectify的并发性

Google app engine GAE中与Objectify的并发性,google-app-engine,concurrency,objectify,Google App Engine,Concurrency,Objectify,我创建了一个测试web应用程序来测试实体的persist read delete,我创建了一个简单的循环来持久化实体,检索并修改它,然后删除它100次 在循环的某个时间间隔内没有问题,但是在某些时间间隔内,实体已经存在错误,因此无法持久化(我添加了一个自定义异常处理) 同样,在循环的某个时间间隔内,实体无法修改,因为它不存在;最后,在某个时间间隔内,实体无法删除,因为它不存在 我知道循环可能太快,以至于对Appengine数据存储的操作尚未完成。因此,当尝试访问实体时,或删除操作尚未完成,因此无

我创建了一个测试web应用程序来测试
实体的persist read delete
,我创建了一个简单的循环来持久化
实体
,检索并修改它,然后删除它100次

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

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

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


但是,我想了解如何处理这种情况,即使用
实体执行并发操作

,据我所知,您正在执行以下操作:

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'
换句话说,对于任何需要快速设置/删除的内容,只需使用局部变量即可。这就是盖伊给你的答案。在你弄清楚了所有快速的东西之后,你就不能把这些信息保存在一个实体中

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


编辑:您还可以查看。

据我所知,您正在执行以下操作:

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'
换句话说,对于任何需要快速设置/删除的内容,只需使用局部变量即可。这就是盖伊给你的答案。在你弄清楚了所有快速的东西之后,你就不能把这些信息保存在一个实体中

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


编辑:您还可以查看。

这需要更多的解释。。。如果没有你所做的上下文,这些错误就没有任何意义。但是,如果我必须猜测,这听起来像是在做异步操作,而不是完成它们。@ StukDig.考虑两个线程试图更新实体的例子,如果这两个线程在同一时间访问实体,那么更新实体,比如说增加一个值,从理论上讲,两个线程中的任何一个在保存操作后都会丢失一个增量。这正是事务被发明的原因:-)@stickfigure-Yah,我刚刚从Objectify代码站点读到它,我实际上实现了DAOT类,现在可以工作了,我相信DAOT模式经过了很好的测试too@stickfigure然而,在阅读了wiki和代码之后,它似乎建立在ConcurrentModificationException的基础上,以确保它不会同时持久化,但是,在读取计数器值时如何,当应用程序试图同时读取密钥时是否存在异常?这需要更多的解释。。。如果没有你所做的上下文,这些错误就没有任何意义。但是,如果我必须猜测,这听起来像是在做异步操作,而不是完成它们。@ StukDig.考虑两个线程试图更新实体的例子,如果这两个线程在同一时间访问实体,那么更新实体,比如说增加一个值,从理论上讲,两个线程中的任何一个在保存操作后都会丢失一个增量。这正是事务被发明的原因:-)@stickfigure-Yah,我刚刚从Objectify代码站点读到它,我实际上实现了DAOT类,现在可以工作了,我相信DAOT模式经过了很好的测试too@stickfigure然而,在阅读了wiki和代码之后,它似乎建立在ConcurrentModificationException的基础上,以确保它不会同时持久化,但是,在读取计数器值时如何,当应用程序同时尝试读取密钥时是否存在异常?是的,批处理事务适用于创建