gpt4 book ai didi

java - 如何确保生成的id在数据库中不存在

转载 作者:行者123 更新时间:2023-12-01 07:19:04 25 4
gpt4 key购买 nike

我想为实体生成唯一的 id 并将该实体存储在 Cassandra 数据库中(仅当具有生成的 id 的实体尚不存在时)。

生成 id 后,我会检查数据库中是否存在具有相同 id 的实体。如果没有,则实体被保存。 MyService 类的示例代码:

synchronized (MyService.class) {
do {
id = generateId();
} while (myDao.find(id) != null);
sampleObject.setId(id);
myDao.create(sampleObject);
}

在 MyDao 中保存我正在使用的实体:

cassandraOperations.insert(sampleObject);

确保数据库中不存在已生成的 ID 的最佳实践是什么?我觉得这个同步块(synchronized block)不是最有效的解决方案。或者也许还有其他方法可以确保仅当数据库中没有具有相同 id 的实体时才插入实体?

最佳答案

如果您每毫秒(每个主机)创建的 uuid 数少于 10k,则类型 1 uuid (timeuuid) 保证不会发生冲突。因此,这是最简单的解决方案,不会影响吞吐量或延迟。如果您使用类型 4 随机 uuid(uuid 类型),则发生碰撞的几率小于从数据中心下方喷发的 super 火山,但它无法提供 timeuuid 所提供的保证。

如果您愿意,还可以在查询中使用带有 IF NOT EXISTS 子句的轻量级事务。

INSERT INTO keyspace_name.table_name
( identifier, column_name...)
VALUES ( value, value ... ) IF NOT EXISTS

仅当该行尚不存在时才会应用突变。该查询将返回一个 applied 字段,告诉您是否成功。如果另一个插入相同的东西,则只有一个可以工作。

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/insert_r.html#reference_ds_gp2_1jp_xj__if-not-exists

这会比较慢,因为它使用 paxos,这需要集群周围的多个跃点才能完成。

关于java - 如何确保生成的id在数据库中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46779530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com