当您将实体插入具有@id Long id;
属性的数据存储区时,数据存储区会自动创建一个随机(或似乎是随机的)Long值作为ID:5490350115034675
。
我想自己设置Long
ID,但要从数据存储中随机生成。
我发现这段代码似乎就是这样:
Key<MyEntity> entityKey = factory().allocateId(MyEntity.class);
Long commentId = entityKey.getId();
然后我可以将commentId
传递给MyEntity
的构造函数,然后将其保存到数据存储区。
当我这样做时,我似乎没有得到一个随机生成的id,它似乎遵循一些奇怪的模式,其中第一个分配的id是1
而下一个是10002
,然后20001
等等。
不确定这意味着什么,以及继续使用是否安全......这是唯一的方法吗?
答案 0 :(得分:2)
当您使用自动生成的ID(即Long)时,GAE使用“分散的”#39; id生成器,它为您提供来自各种键空间的ID。这是因为索引中的大量写入(每秒数千个)或多或少的连续值会导致大量表格分裂,从而损害性能。
当您使用allocateId()
时,您会从分散的ID之前使用的旧分配器中获取ID。它们不一定是连续的或单调的,但它们往往从小开始并且不断增长。
你可以混搭;分配永远不会发生冲突。
但是,我认为你想要看起来像随机的ID,因为你希望它们难以猜测。尽管它们在第一眼看上去,但是分散的id分配器不会产生不可思议的id。如果你想要稀疏的id会阻止某人扫描你的键空间,你需要显式添加一个随机元素。或者首先使用UUID.randomUUID()。
答案 1 :(得分:1)
App Engine使用自己的内部算法分配ID,旨在提高数据存储性能。我相信App Engine团队可以发挥他们的魔力。
引入您自己的分配ID的方案并不那么简单 - 您必须考虑到最终的一致性等等。并且您不太可能从性能方面获得所有这些努力。