hibernate插入的性能问题

时间:2016-08-26 07:37:04

标签: hibernate jpa

我是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吗?

1 个答案:

答案 0 :(得分:1)

您必须将数据库序列设置为Mail::later(5, 'emails.welcome', $data, function ($message) { // }); 。 正如所描述的那样here allocationSize = n意味着:“在每次n次持续调用中,从数据库中获取下一个值一次。然后在中间将值增加1。”。另外,请查看SO上的this answer