是什么导致Memcache操作失败,放弃异常?

时间:2016-08-19 00:23:09

标签: google-app-engine objectify

我有一个应用程序引擎java项目,我正在使用objectify。我在"堆栈驱动程序错误报告"中偶尔得到堆栈跟踪。应用程序引擎Web控制台的视图与将项目放入memcache相关。这是代码:

try {
    TestItem t = new TestItem(...);
    ofy().save().entity(t).now();
} catch (Exception e) {

}

这是我偶尔会看到的错误:

com.googlecode.objectify.cache.MemcacheServiceRetryProxy invoke: Memcache operation failed, giving up
java.lang.reflect.InvocationTargetException
    at com.google.appengine.runtime.Request.process-i4dx9s2kED3CVcPe(Request.java)
    at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:44)
    at com.googlecode.objectify.cache.MemcacheServiceRetryProxy.invoke(MemcacheServiceRetryProxy.java:68)
    at com.sun.proxy.$Proxy9.putAll(Unknown Source)
    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:87)
    at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:102)
    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)
    at com.me.test.Test.putSomethinInMemcache(Test.java:13)
    ...
Caused by: com.google.appengine.api.memcache.MemcacheServiceException: Memcache putAll: Unknown exception setting 1 keys
    at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException(MemcacheServiceApiHelper.java:69)
    at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl$RpcResponseHandlerForPut.handleApiProxyException(AsyncMemcacheServiceImpl.java:349)
    at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.absorbParentException(MemcacheServiceApiHelper.java:111)
    at com.google.appengine.api.utils.FutureWrapper.handleParentException(FutureWrapper.java:52)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:91)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89)
    at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26)
    at com.google.appengine.api.memcache.MemcacheServiceImpl.putAll(MemcacheServiceImpl.java:115)
    ... 52 more

它似乎没有被try-statement捕获。我只是在前面提到的管理控制台中看到它。

有谁知道这意味着什么,或者我怎么能抓住它?我主要担心的是,在此操作失败后,可能会有一个旧对象卡在memcache中。

使用objectify 5.1.10。

由于

1 个答案:

答案 0 :(得分:0)

这是一个get()操作。如果在get()操作期间memcache不可用,Objectify只会从数据存储区读取。记录错误并且性能受到一定影响,但应用程序仍在继续。

技术上可能在写操作期间出错(任何save()清除缓存条目;读取将重新填充缓存)。理论上,这可能会在缓存中留下陈旧信息。没有什么可以真正做到这一点 - 如果你不能清除缓存条目,它将被困在那里。我的建议是,如果您有敏感数据但希望缓存,请在缓存条目(@Cache(expirationSeconds=60)或其他)上设置合理的超时。