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 如何在GAE中将自定义定义唯一编号分配给实体?_Java_Google App Engine_Gwt - Fatal编程技术网

Java 如何在GAE中将自定义定义唯一编号分配给实体?

Java 如何在GAE中将自定义定义唯一编号分配给实体?,java,google-app-engine,gwt,Java,Google App Engine,Gwt,如何为实体分配唯一编号。 唯一编号范围将由用户定义,例如1000000001,因此下一个 数字将为100000002,依此类推 目前,我正在维护一个单独的实体,用于管理我的其他实体的编号范围 在保存任何实体时,我现在正在执行的操作。我读取我的数字范围实体,并选择在那里更新的最后一个数字,将该数字增加1,并将该数字分配给要保存的实体。之后,我将用更新的编号保存编号范围实体 问题:由于它是一个web应用程序,多个用户同时访问它。如果多个用户同时保存同一实体,则会为多个记录分配相同的唯一编号。 如何克

如何为实体分配唯一编号。 唯一编号范围将由用户定义,例如1000000001,因此下一个 数字将为100000002,依此类推

目前,我正在维护一个单独的实体,用于管理我的其他实体的编号范围

在保存任何实体时,我现在正在执行的操作。我读取我的数字范围实体,并选择在那里更新的最后一个数字,将该数字增加1,并将该数字分配给要保存的实体。之后,我将用更新的编号保存编号范围实体

问题:由于它是一个web应用程序,多个用户同时访问它。如果多个用户同时保存同一实体,则会为多个记录分配相同的唯一编号。
如何克服此问题?

如果按实体
编号
指的是实体的密钥名称/标识符,防止将同一编号分配给不同记录的唯一方法是事先保留它们。发件人:

注意:高级应用程序有时可能希望分配 他们自己的数字ID手动添加到他们创建的实体中。要知道,, 然而,没有什么可以阻止云数据存储 将一个手动数字标识分配给另一个实体。唯一的 避免此类冲突的方法是让应用程序获得一个块 使用方法或 . 云数据存储的 自动ID生成器将跟踪已分配的ID 使用这些方法,将避免对另一个实体重用它们,因此 您可以安全地使用此类ID,而不会产生冲突

无论将该编号用作密钥名称/标识符还是仅用作属性值,为了防止多个同时请求在单个事务中分配您需要执行的相同编号,请执行以下操作:

  • 读取存储上次赋值的
    上次赋值的
    实体
  • 递增该值以获取当前数字
  • 将当前编号保存在上次分配的
    实体中
  • 如适用,如上所述分配新标识符
  • 使用当前编号创建新实体
您的代码应该准备好重试整个事务,因为当多个请求试图同时执行时,它将失败-只有一个(最多)将成功更新上次分配的
实体

毫无意义的是,对键名/标识符或属性使用这样的递增值会导致“热平板”数据存储可伸缩性问题,从而影响读/写/索引操作的性能。发件人:

如果您使用的是云数据存储,则可能会由于热备份而导致写入速度变慢 如果平板电脑的写入速率突然增加到很小的程度 超过单个tablet服务器容量的密钥范围。 Bigtable最终将分割密钥空间以支持高负载

默认情况下,云数据存储使用分散的 算法。因此,您通常不会在云上遇到热点 如果使用以高写入速率创建新实体,则会写入数据存储 默认的ID分配策略。有一些角落案例 您可以解决此问题:

  • 如果您以非常高的速率创建新实体,并且您正在分配单调递增的自己的ID

  • 如果您使用单调递增的索引属性(如 时间戳,因为这些属性是索引中行的键 Bigtable中的表

您是否在询问如何在a和b之间生成随机数?要为每个实体生成非静态自定义数,我必须将其存储在单独的实体中。在保存任何实体时,我从该实体读取上次更新的数字,在该实体中我维护自定义数,并通过将该数字增加1并保存两个实体来更新该数字。如果同时出现保存同一实体的其他请求,则可以将相同的编号分配给两个不同的记录。请建议如何克服这类问题。