Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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
如何优化AppEngine Java/JDO数据存储put()以减少写入_Java_Google App Engine_Jdo - Fatal编程技术网

如何优化AppEngine Java/JDO数据存储put()以减少写入

如何优化AppEngine Java/JDO数据存储put()以减少写入,java,google-app-engine,jdo,Java,Google App Engine,Jdo,我正在调整我们在AppEngine上运行的一个应用程序,最大的成本之一是数据存储的读写。我注意到,最严重的违规行为之一是我们坚持一项命令 基本数据是订单有许多项目-我们分别存储这两个项目,并将其关联如下: @PersistenceCapable public class Order implements Serializable { @Persistent(mappedBy="order") @Element(dependent = "true") private

我正在调整我们在AppEngine上运行的一个应用程序,最大的成本之一是数据存储的读写。我注意到,最严重的违规行为之一是我们坚持一项命令

基本数据是订单有许多项目-我们分别存储这两个项目,并将其关联如下:

@PersistenceCapable
public class Order implements Serializable {

     @Persistent(mappedBy="order")
     @Element(dependent = "true")
     private List<Item> orderItems;

     // other fields too obviously
}

@PersistenceCapable
public class Item implements Serializable {

     @Persistent(dependent = "true")
     @JsonIgnore
     private Order order;

     // more fields...

}
@PersistenceCapable
公共类顺序实现可序列化{
@持久性(mappedBy=“order”)
@元素(dependent=“true”)
私人物品清单;
//其他领域也太明显了
}
@持久的
公共类项实现可序列化{
@持久性(dependent=“true”)
@杰索尼奥雷
私人秩序;
//更多领域。。。
}
appstats显示了一个订单的两个数据存储放置和一个项目,但都使用了大量的写入。我想从任何有经验的人那里知道优化这个的最佳方法

AppStats数据:

real=34ms api=1695ms成本=6400计费操作=[数据存储写入:64]

real=42ms api=995ms成本=3600计费操作=[数据存储写入:36]

我所知道的一些领域可能会有所帮助:

  • 更少的索引-我可以告诉appengine不要索引许多order和item属性的隐式索引,例如item.quantity不是我需要查询的对象。但这就是所有这些写作的目的吗
  • 取消item和order的关系,这样我就只有一个实体OrderItem,完全不需要关系(但需要额外的存储来支付)
  • 就显式索引而言,我在订单表中只有1个索引(按订单日期),在订单项上只有1个索引(按SKU/date),在关系中只有隐式索引
  • 如果这些项目是一个集合,而不是一个列表,那么会不会完全不需要在子项IDX上建立索引
  • 所以,我的问题是,上述任何一项都将预示着巨大的胜利,还是我错过了其他更好的选择

    优点:是否有一篇好的“少写数据存储指南”文章

    明确说明:

    • 新实体放置(每个实体,无论实体大小):2次写入+每个索引属性值2次写入+每个复合索引值1次写入

    • 现有实体Put(每个实体):1次写入+4次写入/修改的索引属性值+2次写入/修改的复合索引值

    • 同样相关的还有:

    关于下列问题:

  • 是的,写操作的数量与索引属性的数量有关。制作它们
  • 将两个实体组合在一起将节省1次写入(如果是新实体,则为2次写入)
  • 您不需要仅为一个属性设置“显式”索引。这些由appengine自动生成。您只需要显式配置复合索引,跨越更多属性
  • 不是。集合或列表(=带顺序的集合)只是一种Java表示,数据存储API始终在内部使用列表(=添加的项保留其顺序)
  • 更新:

    索引数影响写入成本,但不影响写入速度:保存实体数据的提交阶段,以及构建索引的应用阶段。
    put
    操作在提交阶段之后返回,并且不受索引数量的影响


    在您的情况下,您正在调用两个看跌期权,一个接一个。正如您可以从AppStats图中看到的,它们是连续发生的。您可能希望以并行方式执行它们(不确定是否在JDO中可用)

    谢谢Peter,除了我注意到的4个步骤之外,还有什么其他步骤是你建议研究的吗?或者我的想法是对的。@Ashley:我用最重要的信息更新了答案-索引的数量会影响写入成本,但不会影响写入速度。要在您的情况下加快速度,请参阅异步操作。