Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谷歌AppEngine HRD——一致性与竞争?_Java_Google App Engine_Datastore - Fatal编程技术网

Java 谷歌AppEngine HRD——一致性与竞争?

Java 谷歌AppEngine HRD——一致性与竞争?,java,google-app-engine,datastore,Java,Google App Engine,Datastore,我正在尝试为一个简单的图表编辑器建模,该编辑器将数据存储到GAE的HRD数据存储中,我面临着一些问题,不知您是否可以给我一些建议。基本上,编辑器的模型是: [图表]--包含-->[形状]--包含-->[文本] 最初,我将它们放在同一个实体组中,以确保数据一致。通过这样做,每当我添加新形状或向现有形状添加文本对象时,它们都会正确显示(从数据存储中查询);但是,我遇到了问题,因为用户可能会快速添加许多形状,这会导致每秒对图表对象进行多个更新,从而导致写入争用 或者,我可以这样设计: [图表][形状-

我正在尝试为一个简单的图表编辑器建模,该编辑器将数据存储到GAE的HRD数据存储中,我面临着一些问题,不知您是否可以给我一些建议。基本上,编辑器的模型是:

[图表]--包含-->[形状]--包含-->[文本]

最初,我将它们放在同一个实体组中,以确保数据一致。通过这样做,每当我添加新形状或向现有形状添加文本对象时,它们都会正确显示(从数据存储中查询);但是,我遇到了问题,因为用户可能会快速添加许多形状,这会导致每秒对图表对象进行多个更新,从而导致写入争用

或者,我可以这样设计:

[图表][形状-包含diagramId][文本-包含shapeId]

这将它们放在不同的实体组中,当我创建一个新形状时,我只需要保存形状对象本身。这解决了写争用问题,但数据不再一致——取决于HRD提交写操作的时间,我可能会得到过时的数据

我尝试了一些组合,比如将图表放在缓存中,并且仅当缓存不包含图表时才从HRD中检索;但是,这是不可预测的,因为我不能确定该图是否在缓存中(我希望同时编辑许多图)

处理此类问题的最佳做法是什么?我正在使用Java和JDO,如果这有什么不同的话…

请注意:

  • 如果您使用
    get
    ,HRD读取是非常一致的;如果您使用
    query
    ,HRD读取最终是一致的(因为查询依赖于索引,而这些索引需要时间构建)。如果可能的话,您可以使用
    get
    ,绕过您的问题

  • 如果文本和形状是一个图表的一部分,并且不需要单独访问它们,也不需要按文本或形状的属性进行搜索,则可以在图表中序列化文本和形状。我使用Objectify,这只是通过字段上的
    @Serialize
    注释实现的(我不知道JDO,因为我不使用它)

  • 几点注意:

  • 如果您使用
    get
    ,HRD读取是非常一致的;如果您使用
    query
    ,HRD读取最终是一致的(因为查询依赖于索引,而这些索引需要时间构建)。如果可能的话,您可以使用
    get
    ,绕过您的问题

  • 如果文本和形状是一个图表的一部分,并且不需要单独访问它们,也不需要按文本或形状的属性进行搜索,则可以在图表中序列化文本和形状。我使用Objectify,这只是通过字段上的
    @Serialize
    注释实现的(我不知道JDO,因为我不使用它)

  • + 1提到客观化——@阿德里安,我敦促你考虑放弃JDO并转移到客观化。它将以一致的方式处理你的MeMcRebug。+ 1提到ObjyType——“阿德里安,我敦促你考虑放弃JDO并移动到ObjyType。它将以一致的方式为您处理memcaching。