小编And*_*gin的帖子

优化休眠序列ID生成

尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。

因此,我将Hibernate设置为使用序列进行ID生成。

  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq") 
  @SequenceGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1)
Run Code Online (Sandbox Code Playgroud)

但是当我插入大量记录(例如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
Run Code Online (Sandbox Code Playgroud)

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

总共大约需要5分钟才能插入40000条记录(通过网络到远程数据库),这对于内存数据库来说非常慢。我认为发生这种情况是因为Hibernate逐一选择了ID的下一个值:

send a request to database
get id
send next request
...
Run Code Online (Sandbox Code Playgroud)

我想加快ID生成的速度,但是不幸的是,我对ID如何改进它还不够了解。我搜索了可能的解决方案,并发现以下想法:

1)在insert语句中调用sequence.nextval。但是,Hibernate团队说这是不可能的:https : …

sql hibernate sequence auto-increment dialect

5
推荐指数
1
解决办法
6597
查看次数

标签 统计

auto-increment ×1

dialect ×1

hibernate ×1

sequence ×1

sql ×1