【发布时间】:2014-09-23 04:56:40
【问题描述】:
在我的应用程序中,并发写入发生在单个实体上,我注意到当超过 3 次/秒的写入发生时,并非所有请求都被持久化。 我正在从事务内部发出请求,但我也没有看到并发修改异常,我正在使用 Objectify,因此未抛出的异常可能是一个对象化的事情。 我知道对于并发写入,我需要实现分片计数器,但即使在那里,我也想绝对确定如果写入被删除,我会被告知。 在 objectify 中是否有 @version 的等价物,或者有没有办法在我的 objectify 实现中使用 JPA/JDO 中的 @version 机制? 继承我的实体的代码:
while (true) {
try {
ofy().transact(new VoidWork() {
public void vrun() {
Venue_Model tnxVenue = ofy().load()
.type(Venue_Model.class).id(tnxVenueID)
.now();
tnxVenue.doStuff();
ofy().save().entities(tnxVenue).now();
}
});
//There are cases where this part of the code is reached but updates to the entity are not reflected in the data store viewer.
break;
} catch (ConcurrentModificationException e) {
// TODO Auto-generated catch block
if (retries == 0) {
e.printStackTrace();
+ person_ref.getKey() + e.toString());
break;
}
retries--;
} catch (Exception e) {
}
}
}
要检查实体是否已持久化,我只需查看 appengine 仪表板上的数据存储查看器即可。
对于持久存在场所的每个请求,我还尝试检索 n 检查实体是否已持久存在,并且奇怪的是,在代码运行期间它会正确返回 - 数据存储查看器却讲述了不同的故事:/ 检查数据是否正确持久化的代码。
venue = ofy().load().type(Venue_Model.class).id(venue_id).now(); // search if person has checked in
if (!venue.allCheckins.contains(person_ref)) {
log.warning("attempt " + i + " for"
+ person_ref.getKey()); // Never entered :/
venue.doStuff(person_ref, subVenueName);
ofy().save().entities(venue).now();
}
【问题讨论】:
-
你能分享你当前的代码,包括你测试请求被持久化的方式吗?
标签: java google-app-engine concurrency objectify