Java EntityNotFoundException的可能原因
在什么情况下,谷歌AppEngine中的一个应用程序会抛出错误 只有在请求时请求的密钥不存在于数据存储中时,才会发生这种情况,还是由于调用过程中的其他问题(例如超时)也会发生这种情况 换句话说,如果我启动一个新事务,并且该事务中的Java EntityNotFoundException的可能原因,java,google-app-engine,Java,Google App Engine,在什么情况下,谷歌AppEngine中的一个应用程序会抛出错误 只有在请求时请求的密钥不存在于数据存储中时,才会发生这种情况,还是由于调用过程中的其他问题(例如超时)也会发生这种情况 换句话说,如果我启动一个新事务,并且该事务中的get()抛出一个EntityNotFoundException,我是否可以100%确定同一事务中的put()将永远不会覆盖一些已经存在的条目,而get()不知何故丢失了这些条目 要添加一些代码: private Entity getOrCreate(Key key,
get()
抛出一个EntityNotFoundException
,我是否可以100%确定同一事务中的put()
将永远不会覆盖一些已经存在的条目,而get()
不知何故丢失了这些条目
要添加一些代码:
private Entity getOrCreate(Key key, String initialData) {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Transaction txn = datastore.beginTransaction();
try {
Entity result;
try {
// Try to read existing entity
result = datastore.get(key);
} catch (EntityNotFoundException e) {
// If entity is not found, create and put a new one
result = new Entity(key);
result.setProperty("data", initialData);
datastore.put(result); // Could this EVER overwrite an existing entity?
}
txn.commit();
return result;
} finally {
if (txn.isActive()) txn.rollback();
}
}
由于某种机制导致EntityNotFoundException而不是该实体真正不存在,此代码是否会意外地覆盖现有实体?当您执行事务时,整个实体组将被事务冻结,直到您提交它。因此,在您的情况下,如果实体组被锁定,就不可能有人在get和put之间“推”自己的实体 我个人能看到的关于“entityNotFound”的唯一问题与最终的一致性有关。例如,如果实例已创建但尚未完全一致,则某些get()查询可能会返回“EntityNotFound”。我会使用一个强一致性查询(比如get_by_id)来确保您的数据存储是一致的 您唯一应该收到“EntityNotFound”错误的时间是来自未被捕获的实体。在这种情况下,要么实体不存在,要么一致性还不强。使用强一致性查询(祖先查询或get_by_id)可以解决这个问题
查看可能有助于您重组模型:)@MarkusA。现在更有意义了:)。检查我编辑的答案,可能对你有帮助^^:)是的!谢谢!:)我删除了我的评论,并对我的问题进行了一些编辑。我担心的一个例子就是“最终一致性”。不幸的是,我不太清楚你所说的“按id获取”是什么意思。你是说一个特定键的实际“get()”而不是一个查询?但基本上你是说没有其他错误机制(读取超时或其他什么)会导致错误?我不知道。读取超时通常会触发“超过截止日期”。如果您得到一个“entityNotFound”,您可以安全地假设您的实体存在问题(再次确认:P)。对于get_by_id,它是python而不是java。所以你唯一的选择就是祖先查询。我添加了一个链接到我的答案:)明白了。。。我会把这个问题留一段时间,看看AppEngine团队的人是否对这个问题有不同的看法,但是如果没有其他信息,你会得到答案√. :)