问题标签 [id-generation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 从 JavaScript 中已知的一组潜在 ID 创建唯一字符串 ID/键的快速方法
假设您想要一组 1 到 2 位的十六进制数字,即 256 个数字。只需使用一个小集合来解决问题,但它适用于任何大小的字符串。
因此,在这种情况下,您有一个潜在 N
的或 256 个数字。您将为遇到的每条新数据记录“生成”一个新 ID。所以它开始并随机给你af
, then 1d
, then8a
等。
直接简单的方法是简单地按顺序生成所有数字,然后将它们洗牌,然后从集合中弹出。当您只有 256 个数字时,这可以正常工作。但是,如果您有数百万或数十亿个数字,这是不切实际的,因为您可能有大量生成的 ID 长时间未使用。我想避免这种情况。
所以我的问题是创建这样的唯一键字符串的最快方法是什么,而不是预先生成所有这些字符串,也不需要按顺序递增 1 或诸如此类。也就是说,密钥应该是看似随机的。
我可以想象的一种方法是使用 trie 来存储已经使用/生成的值。然后,当您要获得一个新值时,您会生成一个随机值,然后检查 trie 以查看它是否已被使用。我不知道如何判断它的效率如何,但是一旦你开始用完 ID 并且下降到集合中的最后几个 ID,它的性能似乎会非常糟糕。您将生成许多已经生成的 ID,并为每个 ID 遍历 trie,因此会很慢。
我想知道是否有更有效的方法来执行此操作,而无需提前生成它们。此外,数据记录不会用于确定 ID,因为记录可能非常大且非常复杂。
也许有一种方法可以一次随机遍历(并生成)一个 trie,并以这种方式生成 ID,因为您最终位于 trie 中一个唯一的随机位置。我不知道,也许是类似的东西。
另外,我对散列并不复杂,所以我不知道是否有任何好的方法。
java - org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.app.entites.LDetails
我尝试了很多次使用下面的代码在我的表中插入 id 值,但它总是抛出 org.hibernate.id.IdentifierGenerationException:必须在调用 save() 之前手动分配此类的 id:com.app.entites.LDetails
以下是实体类中的代码
我已经使用 IdentifierGenerator 实现了 id 生成器,如下所示
}
java - Spring JPA - 序列缓存给出了意想不到的行为。使用分配大小 = 1 是可以的
我的 Spring Boot 应用程序使用 2 个实体类。实体类 1 使用使用序列的技术密钥 id。实体包含其他实体的列表,因此是一对多的。Child 实体使用相同的序列。
使用 20 的序列分配(缓存)大小,我看到我得到 EntityExistsException:
javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与会话关联:[nl.xyz.app1.entity.ChildFields #123456]
实体是:
和
当我使用分配序列 1 时,一切正常!为什么是这样?
等等。
database - 为什么要将分片 ID 附加到生成的 ID 上?
我正在阅读: https ://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c
在最后一节“解决方案”中,他们根据数据库的自动增量功能 + 自纪元以来的毫秒数 + 分片 ID 生成全局唯一 ID。
为什么我们需要给它附加分片 ID?
具体来说,它说
接下来,我们为尝试插入的特定数据获取分片 ID。假设我们按用户 ID 进行分片,并且有 2000 个逻辑分片;如果我们的用户 ID 是 31341,那么分片 ID 是 31341 % 2000 -> 1341。我们用这个值填充接下来的 13 位
这没有任何意义:如果您已经根据分片数量(31341 % 2000)修改用户 ID,这意味着 1)您已经拥有用户 ID!2) 你已经通过 mod 功能知道了它所属的分片!
我在这里有什么误解?
sql-server - 模式验证:使用 Hibernate 序列生成器策略时缺少表 [SEQUENCE_NAME]
我在休眠 id 生成和 ms sql 服务器方面遇到了一些问题。
我GenerationType.SEQUENCE
在我的应用程序中使用休眠生成 ID。
作为 DB,我使用 microsoft sql server 2017。
我通过 Liquibase 创建序列:
启动 Spring Boot 应用程序时出现错误:
当我手动查询序列时,可以找到:
我有点困惑,它说“丢失的桌子”。使用 oracle 可以正常工作。mssql 不支持通过序列生成 id。
我的配置:
我使用这个泊坞窗图像:mcr.microsoft.com/mssql/server:2017-CU12-ubuntu
go - 使用 etcd 集群生成序列号
我正在探索 etcd 来实现分布式环境的序列号生成器。我的要求是生成不重复的序列号,用于同一应用程序的多个实例的每个请求中。并且可以有n个这样的应用程序的要求。我使用golang 客户端包中提供的 STM 和互斥锁以多种方式为此做了 POC
在本地机器设置中使用单节点 etcd 服务器(将是 RAFT 在生产中工作的至少 3 个节点集群),我编写了一个简单的程序来在 500 个 goroutine 中生成 ids(数字)。每个例程每个都有 10 个 id,因此总共有 5000 个 id。使用时间统计,重试尝试的 STM 比互斥锁执行得更好。除了这些方法之外,还有没有更好的选择来实现序列号生成?首先可以将 etcd 用于此目的吗?
PS:我附上代码示例仅供参考。我不希望它被审查。我关心的是使用 etcd 生成序列号的正确方法
hibernate - org.hibernate.MappingException:序列的增量大小在实体映射中设置为 [10] 而 ... size 为 [1]
我们在更新到 Spring Boot 2.2 和相关的 Hibernate 5.4.x 时遇到了问题。
我们确实有以下序列生成器
随着对 SB 2.2 / HB 5.4 的更新,我们得到以下初始化错误
DB序列增量大小为1:
但是,据我了解,hilo 算法的(软)增量大小与数据库的(硬)增量大小无关。
这是HB中的错误还是我们可以以某种方式规避这个问题?
WRT 对 Jens 的问题:
序列由 Liquibase 生成:
/li>它发生在应用程序上下文设置/Bean 初始化期间:
/li>禁用验证不会改变任何东西
向 GH 添加了一个示例项目:https ://github.com/ascheman/hibernate-so-59305427
堆栈跟踪:
/li>
jpa - 如何手动设置 @GeneratedValue 的值
使用 Spring Data JPA 进行 Spring 启动。Postgres 数据库。
一般实体:
当我尝试使用指定id
值创建条目时,结果我看到它被忽略并由@GeneratedValue
.
如何克服这一点?
oracle - 如何使用 JdbcTemplate(或纯 JDBC)从 Oracle 获取带有小写字符的列的生成密钥
如果我创建一个这样的表:
我可以使用如下方法插入一些数据并取回生成的 id:
template
这是一个NamedParameterJdbcTemplate
,但由于没有参数,它应该等效于对 . 的类似调用JdbcTemplate
。
但是,如果我使用一个稍微不同的表,其 id 的列名称为小写:
传递列名id
失败:
使用(下面的完整调用堆栈)
传递引用的列名"id"
也会失败:
使用(下面的完整调用堆栈)
那么:当 id 列是小写时,如何从 Oracle 数据库中获取生成的值?首选基于NamedParameterJdbcTemplate
或 的解决方案JdbcTemplate
,但我也采用基于普通 JDBC 的答案。
更新调用中未引用 id 时的完整调用堆栈
调用更新时引用 id 时的完整调用堆栈
oracle - 在 Oracle Golden Gate 上按序列生成 ID
在我的 Oracle 19c Golden Gate 集群上,不同地理位置的两个实例同时运行。(主动-主动)
在我的应用程序代码中,我需要生成 ID,为此我更喜欢使用 Oracle 序列(nextval 函数)。Oracle Golden Gate不保证在不同站点上生成不同的值。由于存在在不同站点上生成相同 nextval 的风险,因此我正在寻找替代方法。
现在我有两个我不喜欢的选项:
- 每个站点都可以有自己不同的种子值并以 2 递增。
- 每个站点都可以保留一个范围并在自己的范围内产生价值。
除了这些选项,您还有其他建议吗?