在不命中 Memcache 的情况下对象化保存
Objectify save without hitting Memcache
我的实体是 @Cache
d,没关系。
但是,对于 cron 作业,我不想 ofy().save.entities()
接触 Memcache。原因是,我保存了数以千计的对象,我不需要它们热检索。
此外,我不断收到奇怪的异常,例如:
java.lang.reflect.InvocationTargetException
at com.google.appengine.runtime.Request.process-326a59f97d0f0252 (Request.java)
at sun.reflect.GeneratedMethodAccessor21.invoke (Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:42)
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:323)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.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.cache.PendingFutures.completeAllPendingFutures (PendingFutures.java:57)
at com.googlecode.objectify.ObjectifyService.close (ObjectifyService.java:120)
at com.googlecode.objectify.ObjectifyFilter.doFilter (ObjectifyFilter.java:49)
和:
com.google.appengine.api.memcache.MemcacheServiceException: Memcache putAll: Unknown exception setting 2 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.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)
at com.googlecode.objectify.cache.KeyMemcacheService.putAll (KeyMemcacheService.java:91)
at com.googlecode.objectify.cache.EntityMemcache.getAll (EntityMemcache.java:242)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.get (CachingAsyncDatastoreService.java:252)
和:
com.google.appengine.api.memcache.MemcacheServiceException: Memcache getAll: exception getting multiple keys
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException (MemcacheServiceApiHelper.java:69)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper.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.memcache.MemcacheServiceImpl.quietGet (MemcacheServiceImpl.java:26)
at com.google.appengine.api.memcache.MemcacheServiceImpl.getAll (MemcacheServiceImpl.java:64)
at com.googlecode.objectify.cache.KeyMemcacheService.getAll (KeyMemcacheService.java:83)
at com.googlecode.objectify.cache.EntityMemcache.cacheGetAll (EntityMemcache.java:365)
at com.googlecode.objectify.cache.EntityMemcache.putAll (EntityMemcache.java:296)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.success (CachingAsyncDatastoreService.java:279)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.success (CachingAsyncDatastoreService.java:268)
所以,我的问题是,如何在不访问 Memcache 的情况下使用 Objectify 进行保存?
And/or,如何防止这些异常发生?
您可以为操作禁用全局缓存:
ofy().cache(false).save()...
更多详情here
您可以使用ofy().cache(false)
,但您必须注意这一点。
保存时,Objectify 会清除缓存条目。在加载时,Objectify 检查内存缓存,如果该值不存在,则将其保存在内存缓存中以备后用。通常您希望在保存时保持这种清除行为,否则您可能会在缓存中留下过时的条目。批量加载很少访问的实体时,使用 ofy().cache(false).load()...
内存缓存将保持不受污染。
或者从实体 class 中删除 @Cache
。
对于你的异常,我不知道该说些什么;它来自 GAE 而不是 Objectify。
我的实体是 @Cache
d,没关系。
但是,对于 cron 作业,我不想 ofy().save.entities()
接触 Memcache。原因是,我保存了数以千计的对象,我不需要它们热检索。
此外,我不断收到奇怪的异常,例如:
java.lang.reflect.InvocationTargetException
at com.google.appengine.runtime.Request.process-326a59f97d0f0252 (Request.java)
at sun.reflect.GeneratedMethodAccessor21.invoke (Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:42)
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:323)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.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.cache.PendingFutures.completeAllPendingFutures (PendingFutures.java:57)
at com.googlecode.objectify.ObjectifyService.close (ObjectifyService.java:120)
at com.googlecode.objectify.ObjectifyFilter.doFilter (ObjectifyFilter.java:49)
和:
com.google.appengine.api.memcache.MemcacheServiceException: Memcache putAll: Unknown exception setting 2 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.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)
at com.googlecode.objectify.cache.KeyMemcacheService.putAll (KeyMemcacheService.java:91)
at com.googlecode.objectify.cache.EntityMemcache.getAll (EntityMemcache.java:242)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.get (CachingAsyncDatastoreService.java:252)
和:
com.google.appengine.api.memcache.MemcacheServiceException: Memcache getAll: exception getting multiple keys
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException (MemcacheServiceApiHelper.java:69)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper.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.memcache.MemcacheServiceImpl.quietGet (MemcacheServiceImpl.java:26)
at com.google.appengine.api.memcache.MemcacheServiceImpl.getAll (MemcacheServiceImpl.java:64)
at com.googlecode.objectify.cache.KeyMemcacheService.getAll (KeyMemcacheService.java:83)
at com.googlecode.objectify.cache.EntityMemcache.cacheGetAll (EntityMemcache.java:365)
at com.googlecode.objectify.cache.EntityMemcache.putAll (EntityMemcache.java:296)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.success (CachingAsyncDatastoreService.java:279)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService.success (CachingAsyncDatastoreService.java:268)
所以,我的问题是,如何在不访问 Memcache 的情况下使用 Objectify 进行保存?
And/or,如何防止这些异常发生?
您可以为操作禁用全局缓存:
ofy().cache(false).save()...
更多详情here
您可以使用ofy().cache(false)
,但您必须注意这一点。
保存时,Objectify 会清除缓存条目。在加载时,Objectify 检查内存缓存,如果该值不存在,则将其保存在内存缓存中以备后用。通常您希望在保存时保持这种清除行为,否则您可能会在缓存中留下过时的条目。批量加载很少访问的实体时,使用 ofy().cache(false).load()...
内存缓存将保持不受污染。
或者从实体 class 中删除 @Cache
。
对于你的异常,我不知道该说些什么;它来自 GAE 而不是 Objectify。