我在尝试将 Hibernate 与 SAP HANA In-Memory 数据库连接时遇到了一些性能问题,该数据库不支持 AUTO_INCREMENT ( http://scn.sap.com/thread/3238906 )。
所以我将 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 团队说这是不可能的: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)在 inserts 上写一个数据库触发器。但是,对我来说,这看起来是一个糟糕的解决方案,因为我希望有一个通用的 Hibernate 方言与任何数据库实例一起工作。而且我不知道如何将这样的触发器包含在 Hibernate Dialect 中。
您会建议哪种解决方案?你还有其他建议吗?
我将真诚地感谢您对这个问题的任何帮助。如果有人可以提供一些解决方案或文档,甚至提供更详细的解决方案路径,那就太好了。
非常感谢您提前。