在序列生成器中将 allocateSize 设置为 1 是否与使用身份生成器相同?
Is setting allocateSize as 1 in Sequence generator same as using an Identity Generator?
我从身份生成器转移到序列,希望它能提高我的批量插入的性能。我正在使用 JPA EntityManager 的 persist 方法进行批量插入,批量大小为 50。最多插入 300K 条记录。
实体 table 具有以下主键列设置 - 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 的分配大小那样提高性能。但是,由于 allocationSize 为 50,这也会导致新 ID 和已经存在的 ID 之间出现疯狂的差距。
如果您在那里使用 allocationSize,每个实体都需要执行 "select SEQ.nextval from DUAL" 才能从指定的序列中获取 ID。这是你的大记录的问题。
你需要像这样在休眠中设置一个属性:
properties.setProperty("hibernate.id.new_generator_mappings", Boolean.toString(true));
我意识到 Hibernate 增加了太多开销。刚刚为超过 100 万的插入使用了 JdbcTemplate,它就像一个魅力:)
只有在数据负载不是很大的时候,我才会使用hibernate!
我从身份生成器转移到序列,希望它能提高我的批量插入的性能。我正在使用 JPA EntityManager 的 persist 方法进行批量插入,批量大小为 50。最多插入 300K 条记录。
实体 table 具有以下主键列设置 - 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 的分配大小那样提高性能。但是,由于 allocationSize 为 50,这也会导致新 ID 和已经存在的 ID 之间出现疯狂的差距。
如果您在那里使用 allocationSize,每个实体都需要执行 "select SEQ.nextval from DUAL" 才能从指定的序列中获取 ID。这是你的大记录的问题。
你需要像这样在休眠中设置一个属性:
properties.setProperty("hibernate.id.new_generator_mappings", Boolean.toString(true));
我意识到 Hibernate 增加了太多开销。刚刚为超过 100 万的插入使用了 JdbcTemplate,它就像一个魅力:)
只有在数据负载不是很大的时候,我才会使用hibernate!