2016-08-19 30 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)或其他)上設置一個合理的超時時間。