java - EntityNotFoundException 的可能原因

标签 java google-app-engine

什么情况下可以get()在 Google AppEngine 中抛出 EntityNotFoundException

是否真的在请求时数据存储中不存在所请求的 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 other 而该实体确实不存在,此代码是否会曾经意外覆盖现有实体?

最佳答案

当您进行事务时,您的整个实体组将被该事务卡住,直到您提交它为止。因此,在您的情况下,如果实体组被锁定,那么某人就没有真正的机会在您的 get 和 put 之间“推送”自己的实体。

我个人认为“entityNotFound”的唯一问题与最终一致性有关。例如,如果实例已创建但尚未完全一致,则某些 get() 查询可能会返回“EntityNotFound”。我将使用高度一致的查询(例如 get_by_id)来确保您的数据存储区是一致的。

您应该收到“EntityNotFound”错误的唯一一次是来自未捕获的实体。在这种情况下,要么实体不存在,要么一致性还不强。使用高度一致的查询(祖先查询或 get_by_id)可以解决这个问题。

查看 this可能会帮助您重组模型:)

关于java - EntityNotFoundException 的可能原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777129/

相关文章:

python - 包含分号的 POST 在分号后被截断

jquery - 通过 JQuery 向 Google App Engine 发送 POST 请求时没有结果

java - Google App Engine 的 Memcache (Java) 是全局缓存吗?

java - Hibernate架构迁移设置命名策略

java - Android listview in listview追加数据

Java面向对象设计: Returning multiple objects in java

python-3.x - 无法将大文件上传到 GCP App Engine 中的 Python + Flask

java - 如何向 jtextfields 添加扫描仪

java - 相当于扩展HttpServlet

google-app-engine - 如何将私有(private)的、自托管的 NPM 包与 Google App Engine 节点、标准环境一起使用