0

我从身份生成器转移到序列,希望它能提高批量插入的性能。我正在使用 JPA EntityManager 的 persist 方法进行批量插入,批量大小为 50。最多插入 300K 记录。

Entity 表的主键列 - id 具有以下设置:

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

早些时候,当我刚刚使用 allocationSize 作为默认值 50,并使用此属性 - 'hibernate.id.new_generator_mappings' - (将其设置为 true)时,我遇到了诸如 - 批处理条目 0 插入休眠,使用 getNextException()

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

4

2 回答 2

1

如果您在此处使用 allocationSize,则每个实体都需要执行“从 DUAL 中选择 SEQ.nextval”才能从指定序列中获取 ID。这对您的大型记录来说是个问题。

你需要像这样在休眠中设置一个属性:

properties.setProperty("hibernate.id.new_generator_mappings", Boolean.toString(true));
于 2017-04-13T13:42:28.280 回答
-1

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

只有当数据负载不是很大时,我才会使用休眠!

于 2017-04-19T06:22:33.787 回答