Java 数据存储及;Memcache一致性-谷歌应用程序引擎&;客观化
我在确保数据存储的一致性方面遇到了一个相当棘手的问题。 我们正在尝试每1分钟(cron)对BigQuery执行一次同步作业,并依赖数据存储来存储上一次同步完成的时间戳 当加载对象时,我们仍然可以看到最终的一致性,而我正在经历令人毛骨悚然的时刻 设置和父类都作为单例存储在数据存储中,即只存在一个Java 数据存储及;Memcache一致性-谷歌应用程序引擎&;客观化,java,google-app-engine,google-cloud-datastore,objectify,consistency,Java,Google App Engine,Google Cloud Datastore,Objectify,Consistency,我在确保数据存储的一致性方面遇到了一个相当棘手的问题。 我们正在尝试每1分钟(cron)对BigQuery执行一次同步作业,并依赖数据存储来存储上一次同步完成的时间戳 当加载对象时,我们仍然可以看到最终的一致性,而我正在经历令人毛骨悚然的时刻 设置和父类都作为单例存储在数据存储中,即只存在一个 @Entity public class Settings { @Parent private Key<ParentClass> parent = ParentClass.g
@Entity
public class Settings {
@Parent
private Key<ParentClass> parent = ParentClass.getKey();
@Id
private Long id = 123L;
...
public Settings save(){
ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).save().entity(this).now();
return this;
}
public static Settings get(){
Settings settings = ofy().cache(false).consistency(ReadPolicy.Consistency.STRONG).load().key(Key.create(ParentClass.getKey(), Settings.class, 123L)).now();
if (settings == null) settings = create();
return settings;
}
private static Settings create(){
return new Settings().save();
}
}
@实体
公共类设置{
@母公司
私钥parent=ParentClass.getKey();
@身份证
专用长id=123L;
...
公共设置保存(){
ofy().cache(false).consistency(ReadPolicy.consistency.STRONG).save().entity(this.now());
归还这个;
}
公共静态设置get(){
Settings Settings=ofy().cache(false).consistency(ReadPolicy.consistency.STRONG).load().key(key.create(ParentClass.getKey(),Settings.class,123L)).now();
如果(settings==null)settings=create();
返回设置;
}
私有静态设置创建(){
返回新设置().save();
}
}
有人知道是什么导致了这一结果最终的一致性吗
编辑:web.xml摘录:
<filter>
<filter-name>ObjectifyFilter</filter-name>
<filter-class>com.googlecode.objectify.ObjectifyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ObjectifyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>asyncCacheFilter</filter-name>
<filter-class>com.googlecode.objectify.cache.AsyncCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>asyncCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
目标过滤器
com.googlecode.objectify.ObjectifyFilter
目标过滤器
/*
异步缓存过滤器
com.googlecode.objectify.cache.AsyncCacheFilter
异步缓存过滤器
/*
问题是Objectify的内部会话缓存
最初是通过在第一次加载()之前使用ofy().clear()手动清除缓存来解决的,然后通过升级到Objectify 5.1.5来进一步改进。我看到那篇文章,你会有类似的问题吗?介意发布你的web.xml吗?因为
get()
方法是按键获取的,所以它应该总是具有很强的一致性。@Patrice,我也看到了那篇文章,但是唉。。在帖子中添加了objectify过滤器..@tx802-我同意,这就是为什么我对这个问题感到完全困惑的原因。。在尽可能优化后,我甚至将Settings类重命名为Setting,但问题仍然存在,有时甚至会得到一个小时的对象,这是没有意义的。还值得注意的是,通过刷新memcache,这种情况仍然存在。会话缓存行为在此处有详细的说明:。常见问题解答中也提到了这一点:我认为文档中的要点是:缓存实体的按键操作(单个或批处理)将返回实体实例,而无需调用数据存储甚至memcache。
。可能,您正在加载的实体已经在会话缓存中,因此objectify正在进行本地简单的hashmap查找,而不是memcache调用。