在PostgreSQL中使用GenerationType.IDENTITY会失效批处理能力。因此使用其(BIG)SERIAL,它的作用类似MySQL的 AUTO_INCREMENT。
这里使用GenerationType.SEQUENCE激活批插入处理,通过hi/lo算法优化它。
第一步,使用GenerationType.SEQUENCE替代GenerationType.IDENTITY:
@Entity public class TennisPlayer implements Serializable {
private static final long serialVersionUID = 1L;
@Id // This will disable insert batching - AVOID IT! 会失效批处理 // @GeneratedValue(strategy = GenerationType.IDENTITY) // This will work, but better use the below solution 性能不佳 // @GeneratedValue(strategy = GenerationType.AUTO)
// This will allow insert batching and optimizes the identifiers // generation via the hi/lo algorithm @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo") @GenericGenerator(name = "hilo", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { @Parameter(name = "sequence_name", value = "sequence"), @Parameter(name = "initial_value", value = "1"), @Parameter(name = "increment_size", value = "10"), @Parameter(name = "optimizer", value = "hilo") }) private Long id;
|
这里依靠hi/lo算法在一次数据库往返中获取多个标识符:
源代码可以在这里找到 。