Java 如何在GAE中将自定义定义唯一编号分配给实体?
如何为实体分配唯一编号。 唯一编号范围将由用户定义,例如1000000001,因此下一个 数字将为100000002,依此类推 目前,我正在维护一个单独的实体,用于管理我的其他实体的编号范围 在保存任何实体时,我现在正在执行的操作。我读取我的数字范围实体,并选择在那里更新的最后一个数字,将该数字增加1,并将该数字分配给要保存的实体。之后,我将用更新的编号保存编号范围实体 问题:由于它是一个web应用程序,多个用户同时访问它。如果多个用户同时保存同一实体,则会为多个记录分配相同的唯一编号。Java 如何在GAE中将自定义定义唯一编号分配给实体?,java,google-app-engine,gwt,Java,Google App Engine,Gwt,如何为实体分配唯一编号。 唯一编号范围将由用户定义,例如1000000001,因此下一个 数字将为100000002,依此类推 目前,我正在维护一个单独的实体,用于管理我的其他实体的编号范围 在保存任何实体时,我现在正在执行的操作。我读取我的数字范围实体,并选择在那里更新的最后一个数字,将该数字增加1,并将该数字分配给要保存的实体。之后,我将用更新的编号保存编号范围实体 问题:由于它是一个web应用程序,多个用户同时访问它。如果多个用户同时保存同一实体,则会为多个记录分配相同的唯一编号。 如何克
如何克服此问题?如果按实体
编号
指的是实体的密钥名称/标识符,防止将同一编号分配给不同记录的唯一方法是事先保留它们。发件人:
注意:高级应用程序有时可能希望分配
他们自己的数字ID手动添加到他们创建的实体中。要知道,,
然而,没有什么可以阻止云数据存储
将一个手动数字标识分配给另一个实体。唯一的
避免此类冲突的方法是让应用程序获得一个块
使用方法或
. 云数据存储的
自动ID生成器将跟踪已分配的ID
使用这些方法,将避免对另一个实体重用它们,因此
您可以安全地使用此类ID,而不会产生冲突
无论将该编号用作密钥名称/标识符还是仅用作属性值,为了防止多个同时请求在单个事务中分配您需要执行的相同编号,请执行以下操作:
- 读取存储上次赋值的
上次赋值的
实体
- 递增该值以获取当前数字
- 将当前编号保存在上次分配的
实体中
- 如适用,如上所述分配新标识符
- 使用当前编号创建新实体
实体
毫无意义的是,对键名/标识符或属性使用这样的递增值会导致“热平板”数据存储可伸缩性问题,从而影响读/写/索引操作的性能。发件人:
如果您使用的是云数据存储,则可能会由于热备份而导致写入速度变慢
如果平板电脑的写入速率突然增加到很小的程度
超过单个tablet服务器容量的密钥范围。
Bigtable最终将分割密钥空间以支持高负载
默认情况下,云数据存储使用分散的
算法。因此,您通常不会在云上遇到热点
如果使用以高写入速率创建新实体,则会写入数据存储
默认的ID分配策略。有一些角落案例
您可以解决此问题:
- 如果您以非常高的速率创建新实体,并且您正在分配单调递增的自己的ID
- 如果您使用单调递增的索引属性(如
时间戳,因为这些属性是索引中行的键
Bigtable中的表
您是否在询问如何在a和b之间生成随机数?要为每个实体生成非静态自定义数,我必须将其存储在单独的实体中。在保存任何实体时,我从该实体读取上次更新的数字,在该实体中我维护自定义数,并通过将该数字增加1并保存两个实体来更新该数字。如果同时出现保存同一实体的其他请求,则可以将相同的编号分配给两个不同的记录。请建议如何克服这类问题。