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