Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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

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
Java EntityNotFoundException的可能原因_Java_Google App Engine - Fatal编程技术网

Java EntityNotFoundException的可能原因

Java EntityNotFoundException的可能原因,java,google-app-engine,Java,Google App Engine,在什么情况下,谷歌AppEngine中的一个应用程序会抛出错误 只有在请求时请求的密钥不存在于数据存储中时,才会发生这种情况,还是由于调用过程中的其他问题(例如超时)也会发生这种情况 换句话说,如果我启动一个新事务,并且该事务中的get()抛出一个EntityNotFoundException,我是否可以100%确定同一事务中的put()将永远不会覆盖一些已经存在的条目,而get()不知何故丢失了这些条目 要添加一些代码: private Entity getOrCreate(Key key,

在什么情况下,谷歌AppEngine中的一个应用程序会抛出错误

只有在请求时请求的密钥不存在于数据存储中时,才会发生这种情况,还是由于调用过程中的其他问题(例如超时)也会发生这种情况

换句话说,如果我启动一个新事务,并且该事务中的
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团队的人是否对这个问题有不同的看法,但是如果没有其他信息,你会得到答案√. :)