gpt4 book ai didi

sql - 优化 Hibernate Sequence ID 生成

转载 作者:行者123 更新时间:2023-12-04 20:12:42 24 4
gpt4 key购买 nike

我在尝试将 Hibernate 与不支持 AUTO_INCREMENT ( http://scn.sap.com/thread/3238906 ) 的 SAP HANA In-Memory 数据库连接时遇到了一些性能问题。

所以我已经将 Hibernate 设置为使用序列来生成 ID。

  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") 
@SequenceGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1)

但是当我插入大量记录(例如 40000)时,Hibernate 首先生成 ID。看起来像:
DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92080]]
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92080, using strategy: org.hibernate.id.SequenceHiLoGenerator
DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92081]]
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92081, using strategy: org.hibernate.id.SequenceHiLoGenerator

并且只有在生成所有 ID 之后,它才会开始实际插入。

总之,插入40000条记录(通过网络到远程数据库)大约需要5分钟,这对于内存数据库来说非常慢。我认为这是因为 Hibernate 为 ID 一一选择下一个值:
send a request to database
get id
send next request
...

我想加快 ID 生成速度,但不幸的是,我对它的工作原理还不够了解以改进它。我搜索了可能的解决方案并找到了以下想法:

1) 在插入语句中调用 sequence.nextval .但是,Hibernate Team 表示这是不可能的: https://forum.hibernate.org/viewtopic.php?f=1&t=932506

2) 使用 SequenceHiLoGenerator .这可能是一个解决方案,但我不明白如何设置它......如果我写
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") 
@SequenceHiLoGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1),

我在 Eclipse 中收到“无法从 SequenceHiLoGenerator 转换为注释”错误

3) 在插入时编写数据库触发器 .但是,对我来说,这似乎是一个糟糕的解决方案,因为我想要一个通用的 Hibernate Dialect 与任何数据库实例一起工作。而且我不明白如何将这样的触发器包含到 Hibernate Dialect 中。

你会建议哪种解决方案?你还有其他建议吗?

我将衷心感谢您对这个问题的任何帮助。如果有人可以提供一些解决方案或文档,甚至只是更详细的解决方案途径,那就太好了。

非常感谢您。

最佳答案

序列中的值被一一获取,因为 allocationSize设置为 1。 allocationSize 的默认值是50,这已经好多了。在这种特殊情况下,如果插入 40000 条记录是典型用例,则使用高于该值的值可能是有意义的。

如果创建序列的脚本是自己编写的(而不是由 Hibernate 编写的),则值 INCREMENT BY应与 allocationSize 的值相同.

关于sql - 优化 Hibernate Sequence ID 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344795/

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