2016-08-19 95 views
1

我有一个应用程序引擎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语句被抓。我刚刚在前面提到的管理控制台中看到它。

有人知道这意味着什么,或者我怎么能抓住它?我主要担心的是,在此操作失败后,可能有旧对象的副本卡在内存缓存中。

使用对象化5.1.10。

谢谢

+0

我们遇到同样的问题,并且经常以某种方式怀疑它实际上是一个memcache不可用的问题..除非谷歌基础结构是flakey(实际上也怀疑它)。未知的异常让我感到困扰。 – ticktock

回答

0

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

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