在Sequence生成器中将allocateSize设置为1与使用Identity Generator相同吗?

时间:2017-04-13 13:13:19

标签: java hibernate jpa sequence-generators

我从Identity generator转到Sequence,希望它能提高我的批量插入的性能。我正在使用JPA EntityManager的持久化方法进行批量插入,批量大小为50.插入最多300K记录。

实体表对主键列具有以下设置 - id:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="myseq")
@SequenceGenerator(name="myseq", sequenceName="my_table_id_seq", allocationSize = 1)
private Long id;

之前,当我刚使用allocateSize作为默认值50时,并使用了这个属性 - ' hibernate.id.new_generator_mappings' - (设置为true),我遇到了诸如 - 批量输入0插入到hibernate,使用getNextException()

等问题

因此,我将allocationSize更改为1.从那时起,我没有看到上面的问题。但是,这并没有像50的分配大小那样提高性能。但是,由于allocationSize为50,这也导致新ID和已经存在的ID之间存在疯狂的差距。

2 个答案:

答案 0 :(得分:1)

如果你在那里使用allocationSize,每个实体都需要执行"从DUAL"中选择SEQ.nextval。为了从指定的序列中获取ID。这对你的大记录来说是个问题。

你需要在hibernate中设置一个属性:

properties.setProperty("hibernate.id.new_generator_mappings", Boolean.toString(true));

答案 1 :(得分:-1)

我意识到Hibernate增加了太多的开销。刚刚使用JdbcTemplate进行超过100万的插入,它就像魅力一样:)

只有当数据负载不是那么大时我才会使用hibernate!

相关问题