我是hibernate的新手。如果下面的任何一个错误,请纠正我。
有一个实体使用序列生成器进行id生成。因此,每个插入都有两个调用,一个用于获取序列,另一个用于插入
@Id
@SequenceGenerator(name="i_gen", sequenceName="b_seq", allocationSize=6)
@GeneratedValue(generator="i_gen")
private Long id;
在我对allocationsize的研究中,我明白在指定分配大小时,我们不会为下一个已分配的大小调用db,而只是递增1.但是我没有看到这种行为。如果我错了,请纠正我。
以下是我看到的SQL日志
[INFO ] [26082016.002159] sqltiming:357 - select b_seq.nextval from dual {executed in 69 msec}
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 174 msec}
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 74 msec}
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 77 msec}
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 78 msec}
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 161 msec}
对于在单个事务中插入的6个对象,我看到6次调用db来获取nextval和6次插入。我通过使用批量插入来优化插入。但是我无法绕过seq发电机问题。由于这个原因,我看到了巨大的性能打击。
还有什么不能让这么多db调用来获取seqnumber吗?
答案 0 :(得分:1)
您必须将数据库序列设置为Mail::later(5, 'emails.welcome', $data, function ($message) {
//
});
。
正如所描述的那样here allocationSize = n意味着:“在每次n次持续调用中,从数据库中获取下一个值一次。然后在中间将值增加1。”。另外,请查看SO上的this answer。