【问题标题】:Hibernate, what is the most efficient id generation strategy?Hibernate,最有效的 id 生成策略是什么?
【发布时间】:2012-12-24 21:59:34
【问题描述】:

我需要通过 Hibernate 将许多实体插入数据库。所以,我想找到最有效的Id生成算法。

据此Hibernate Documentation 存在四种广泛使用的生成策略:

  • 身份
  • 序列
  • 表格
  • 自动

我应该使用 MySQL 数据库,所以我不能应用 SEQUENCE 生成策略。其他策略呢?从性能的角度来看,什么是最有效的?

【问题讨论】:

标签: java mysql performance hibernate id-generation


【解决方案1】:

由于您不能使用SEQUENCE,而AUTO 只是自动从现有算法中选择支持的生成器算法,因此您只剩下IDENTITYTABLE

  • TABLE:使用 hi/lo 算法有效地生成 long、short 或 int 类型的标识符,给定一个表和列作为 hi 值的来源。 hi/lo 算法生成仅对特定数据库唯一的标识符。 -> 表示每个生成的实体的额外查询。 (如果您使用优化器,则情况并非如此。不幸的是,如果未指定优化器,通常不使用优化器是默认设置。)

  • IDENTITY:支持 DB2、MySQL、MS SQL Server、Sybase 和 HypersonicSQL 中的标识列。 -> 性能方面,这是要走的路,就像你在没有 Hibernate 的情况下正常做的那样。生成数据库,几乎没有开销。

存在更多特定于 Hibernate 的生成器,但它们在性能方面不会超过数据库生成的 ID。 (请参阅链接文档中的 5.1.2.2.1. Various additional generators。)

【讨论】:

  • IDENTITY 还需要对每个插入的实体进行额外查询,以获取生成的 ID。与表策略相反,这是不可优化的。
  • 这对 MySQL 来说是正确的,正如所问的那样。如果您的 DMBS 支持在插入语句中检索 ID,则没有第二次往返(例如 MS SQL Server)。引擎盖下有很多差异,您在回答时必须注意......
【解决方案2】:

Hibernate 中最好的 id 生成器是 enhanced-tableenhanced-sequence,再加上适当的优化器,例如 hilo。我有 enhanced-table + hilo 的经验,每秒插入超过 10,000 条记录。

顺便说一句,“hilo 需要对每个生成的实体进行额外查询”的说法显然是错误的:优化器的全部目的是防止这种情况。

【讨论】:

  • 关于优化器,你是对的。我不知道它们,而我的答案集中在基本的生成器上。带有优化器的增强型生成器解决了这些缺点。
  • 但是你确实提到了 hi/lo:在早期版本的 Hibernate 中,它并没有很好地与基本的 id 生成策略分开,但是它仍然提供了相同的关键优势:减少了 id-管理选择。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2012-06-06
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多