2016-08-26 4 views
0

Ich bin neu im Winterschlaf. Bitte korrigieren Sie mich, wenn einer der folgenden Punkte falsch ist.Leistungsproblem mit Hibernate einfügen

Es gibt eine Entität, die einen Sequenzgenerator für die ID-Generierung verwendet. Da diese von jedem Einsatz ist mit zwei Anrufen eine Sequenz zu erhalten und andere um den Einsatz zu tun

@Id 
@SequenceGenerator(name="i_gen", sequenceName="b_seq", allocationSize=6) 
@GeneratedValue(generator="i_gen") 
private Long id; 

Während meiner Recherchen über allocationSize verstand ich, dass die Zuordnungsgröße auf der Angabe, werden wir nicht db für die nächsten paar allocatedsize nennen, aber Einfach um 1 erhöhen. Aber ich sehe dieses Verhalten nicht. Bitte korrigieren Sie mich, wenn ich falsch liege.

Im Folgenden wird die SQL-Protokolle, die ich

[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} 

Für 6 Objekte sehen steckten in einer einzigen Transaktion, ich sehe 6 Anrufe nextval und 6 Einsätze zu bekommen db. Ich habe die Inserts mit Batch-Inserts optimiert. Ich bin jedoch nicht in der Lage, das seq generator Problem zu umgehen. Ich sehe deswegen einen enormen Leistungseinbruch.

Gibt es noch etwas anderes, um nicht so viele db-Aufrufe zu bekommen, um seqnumber zu bekommen?

+0

Ich kann mich nicht an die Syntax erinnern, aber Sie können einen Block von Primärschlüsseln an eine JVM im Massenspeicher vorab zuweisen dann verwenden Sie – farrellmr

+0

Ihre Erwartung ist richtig. Andere JPA-Impls, die ich verwendet habe, rufen die Sequenz nicht für jede Einfügung auf, sondern verwenden die Zuordnung und speichern diese. Ich würde normalerweise erwarten, dass der '@ SequenceGenerator' auf CLASS-Ebene angegeben wird (obwohl nicht unbedingt notwendig), und strategie = GenerationType.SEQUENCE auf dem' @ GeneratedValue' (wichtiger) –

Antwort

1

Sie müssten Ihre DB-Sequenz auf INCREMENT BY 6 setzen. Wie beschrieben here Die allocationSize = n bedeutet: "Go und holen Sie den nächsten Wert aus der Datenbank einmal in jedem Persist Calls. Und lokal erhöhen Sie den Wert von 1 zwischen.". Überprüfen Sie auch this answer auf SO.