【问题标题】:IllegalArgumentException - Key is incomplete - ObjectifyIllegalArgumentException - 密钥不完整 - 对象化
【发布时间】:2014-05-02 10:03:57
【问题描述】:

我遇到了一个似乎与内存缓存有关的错误。

java.lang.IllegalArgumentException: Key is incomplete.
    at com.google.appengine.api.datastore.KeyFactory.keyToString(KeyFactory.java:164)
    at com.googlecode.objectify.cache.KeyMemcacheService.stringify(KeyMemcacheService.java:62)
    at com.googlecode.objectify.cache.KeyMemcacheService.putAll(KeyMemcacheService.java:91)
    at com.googlecode.objectify.cache.EntityMemcache.empty(EntityMemcache.java:319)
    at com.googlecode.objectify.cache.CachingAsyncDatastoreService$5.trigger(CachingAsyncDatastoreService.java:445)
    at com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:89)
    at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:104)
    at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22)
    at com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)

我试图坚持的对象正在扩展以下内容,并且有 @Parent Key someclass;

public abstract class AbstractVO<T> implements iVO<T> {
private static final Logger log = Logger.getLogger(AbstractVO.class.getName());

@Id
private Long id;

@Index
private Date lastModified;

public Long getId() {
    return id;
}

public Date getLastModified() {
    return lastModified;
}

public void setId(Long id) {
    this.id = id;
}

public void setLastModified(Date lastModified) {
    this.lastModified = lastModified;
}

public Key<?> getKey() {
    return Key.create(this);
}

@OnSave
public void onSaveFunction(){
    setLastModified(new Date());
}



@SuppressWarnings("unchecked")
public T save(){
    try {
        ofy().save().entity(this).now();
    } catch (IllegalArgumentException e){
        log.log(Level.SEVERE, "boom, key was incomplete", e);
    }
    return (T) this;
}

public Result<Void> delete(){
    return ofy().delete().entity(this);
}

@SuppressWarnings("unchecked")
public T refresh(){
    if (getId() != null){
        return (T) ofy().load().entity(this).now();
    }
    else {
        return (T) this;
    }
}

日志显示保存实体所需的数据是您所期望的:

parent id:5813790675304448
parent key:ag5zfnRlY2gtZXNzZW5jZXJZCxIHQ29tcGFueRiAgIDAyK2fCAwLEghDYW1wYWlnbhiAgICA0pCXCwwLEgpBY3Rpb25UeXBlGICAgICS5-gJDAsSDFNlbGxlckFjdGlvbhiAgICAyvOpCgw
entity id: null

以前有没有人遇到过这个问题,我该如何解决?我已经编写了测试用例来尝试在我的开发服务器上重现,但它们都通过了。这似乎只是生产上的问题。

编辑:

我已经删除了受影响实体上的缓存,这导致实体的保存需要 10 秒(我猜这是超时?)和高争用导致它崩溃..

【问题讨论】:

  • 你能分享一些你试图坚持的代码或对象吗?
  • 我已经添加了抽象对象,谢谢
  • 这部分公钥> getKey() { return Key.create(this); } 不需要,因为 Appengine 会自己生成密钥。
  • 嗨 Ankur,这是一种虚荣方法,不用于执行查询,而是分配父对象和引用对象。您怀疑它会影响对象的持久化吗?
  • @koma 我想我已经发现了问题,它只是争用。我已经重写了我的大部分应用程序来验证 - 我现在正在迁移,会通知你。跨度>

标签: java google-app-engine objectify


【解决方案1】:

我想我已经发现了问题,它只是争用。我已经重写了我的大部分应用程序来验证 - 我现在正在迁移,会通知你

  • 这确实是问题所在,我的解决方案是从层次结构中删除实体并将父项添加为索引字段。

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多