Orakelsequenz im Winterschlaf erzeugt eine große Lücke
Ich bin mit hibernate 3 oracle 10g. Ich habe eine Tabelle: Thema. Die definition ist hier
CREATE TABLE SUBJECT
(
SUBJECT_ID NUMBER (10),
FNAME VARCHAR2(30) not null,
LNAME VARCHAR2(30) not null,
EMAILADR VARCHAR2 (40),
BIRTHDT DATE not null,
constraint pk_sub primary key(subject_id) USING INDEX TABLESPACE data_index
)
;
beim einfügen eines neuen Subjekt, sub_seq verwendet wird, um eine Thema-id, die definition ist hier
create sequence sub_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 100
NOCYCLE ;
das Thema Klasse ist wie folgt:
@Entity
@Table(name="ktbs.syn_subject")
public class Subject {
@Id
@Column(name="subject_id")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SUB_SEQ")
@SequenceGenerator(name="SUB_SEQ", sequenceName = "SUB_SEQ")
private long subjectId;
private String fname;
private String lname;
private String emailadr;
private Date birthdt;
}
in der Thema-Tabelle , dort wurden 4555 Themen in die Datenbank geladen, die von plsql-Skripten aus excel und die sub_sequence fein gearbeitet. Thema-ids reichen von 1--4555.
jedoch, wenn ich fügte hinzu, ein Thema aus meiner Anwendung mit hibernate,
die Sequenznummer sprang 255050. Nach einigen Tagen läuft das Thema ids generiert durch hibernate wie folgt Aussehen
270079
270078
270077
270076
270075
270074
270073
270072
270071
270070
270069
270068
270067
270066
270065
270064
270063
270062
270061
270060
270059
270058
270057
270056
270055
270054
270053
270052
270051
270050
265057
265056
265055
265054
265053
265052
265051
265050
260059
260058
260057
260056
260055
260054
260053
260052
260051
260050
255067
255066
255065
255064
255063
255062
255061
255060
255059
255058
255057
255056
255055
255054
255053
255052
255051
255050
4555
4554
4553
.
.
.
.
1
Gibt es mehrere große Lücken: 4555, 255051, 255067 zu 260051, 265057 zu 270051
dies ist eine Verschwendung und nicht ein erwünschtes Verhalten.
weiß jemand, warum dies geschieht, und heiß es zu beheben
Dank
InformationsquelleAutor der Frage sse | 2011-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass das problem kommt von der Tatsache, dass die Sequenz-generator ist nicht wirklich ein Sequenz-generator, sondern einer Sequenz generator hilo, mit einer Zuordnungsgröße der Vorgabe (default 50. wie dies durch die Dokumentation : http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier
Dies bedeutet, dass, wenn die Sequenz mit dem Wert 5000, die nächsten generierten Wert 5000 * 50 = 250000. Hinzufügen der cache-Wert der Sequenz der Gleichung, und es könnte erklären, Ihre große anfängliche Lücke.
Überprüfen Sie den Wert der Sequenz. Es sollte weniger als die zuletzt generierte id. Seien Sie vorsichtig, nicht neu zu initialisieren (die Reihenfolge dieser letzten generierten Wert + 1, da die generierten Werte würden exponentiell wachsen (wir hatten dieses problem, und hatte negative integer-ids durch überlauf)
InformationsquelleAutor der Antwort JB Nizet
Stimmen mit JB. Aber trotzdem danke an PaulJ.
Um genauer zu sein zu meiner Anmerkung folgenden code:
Wenn Sie
javax.persistence.SequenceGenerator
, hibernate verwenden hilo und möglicherweise schaffen große Lücken in der Sequenz. Es gibt eine post, die Lösung dieses Problems:https://forum.hibernate.org/viewtopic.php?t=973682
Gibt es zwei Möglichkeiten, um dieses problem zu beheben
allocationSize = 1, initialValue= 1
statt mit javax.die Persistenz.SequenceGenerator, verwenden Sie org.hibernate.Anmerkungen, wie diese:
Habe ich getestet, beide Wege, die Prima funktioniert.
InformationsquelleAutor der Antwort sse
Andere Lösung ist:
Verwenden " - Strategie = GenerationType.AUTO' anstelle von 'strategy = GenerationType.SEQUENZ', wie unten
InformationsquelleAutor der Antwort Jaydip Halake
Tatsächlich mit allocationSize=1 ist in Ordnung, wenn Ihre Sequenz
INCREMENT VALUE
1 ist und Sie nicht das Bedürfnis haben, die das fortbestehen einer Menge von Entitäten.Allerdings, wenn Sie möchten, um zu bestehen Tausende oder Millionen von Datensätzen, die oben beschriebene Einstellung könnte ein performance-Engpass da alle sparen müssen, Holen Sie sich eine id brauchen folglich eine db zu Lesen.
Um dieses problem zu Lösen, müssen wir um die
allocationSize
etwas wie 500 und ReihenfolgeINCREMENT VALUE
DB auch um die 500, dann die wichtigsten hinzufügen einer hibernate-Einstellunghibernate.id.new_generator_mappings
Fragen zur Verwendung der neuen Sequenz generator-Implementierung, die ich hier übernehmen Sie Ihre hibernate-Eigenschaften in java-Config-Klasse:Diese Weise, Hibernate verwenden
SequenceStyleGenerator
statt der altenSequenceHiLoGenerator
zum generieren der ids. DieSequenceStyleGenerator
ist mehr jpa und oracle-freundlich. Es erzeugt identifier-Werte basiert auf einer Sequenz-Stil Datenbank-Struktur. Variationen reichen aus, tatsächlich mit einer Sequenz mit Hilfe einer Tabelle zu imitieren, um eine Sequenz.Blick auf meine post für weitere Details, wenn Sie im gleichen Boot:
vcfvct.wordpress.com/2016/04/23/jpa-sequencegenerator-with-allocationsize-1-performance-tuning/
InformationsquelleAutor der Antwort Leon li
Wenn Sie Lesen Sie den folgenden link, Sie werden sehen, dass das problem verursacht, indem Sie die CACHE-Einstellung auf der Reihenfolge der Schöpfung Befehl. Entfernen Sie die cache-Einstellung zu lösen, wird das problem zu einem gewissen Grad - aber nicht zu berücksichtigen, die Möglichkeit des rollbacks etc.
Link: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:369390500346406705
Nur so resync Ihre Folgen, nun ist erneut die Sequenz zu erstellen, benennen Sie die aktuelle Tabelle und erstellen Sie die Tabelle erneut, und setzen Sie dann die Datensätze aus der alten Tabelle in die neue Tabelle.
HINWEIS: Der cache-Wert für die Sequenzen ist nützlich für große Lasten, wobei 'x' - Sequenz Werte zugeordnet sind, auf einmal. Wenn Sie eine Transaktion system, in dem Sie eine einfügen - dann ist caching nicht sinnvoll (oder sollte ich sagen - ich habe nie gefunden es nützlich).
HINWEIS: Dies ist mein Verständnis von der cache-option für die Sequenzen. Sie können sich die Oracle-Dokumentation zu ERSTELLEN, die ABFOLGE von Befehlen für mehr info. Aber der link oben sollte eine vernünftige Antwort auf deine Frage.
Dank.
Paul
InformationsquelleAutor der Antwort PaulJ
Den meisten erfolgreichen Antwort wäre:
InformationsquelleAutor der Antwort Bhabani Sankar Sahoo
Hatte ich ähnliche Probleme. Sequenz generator-und Sequenz-generator hilo sind Recht ähnlich, haben aber Unterschiede. In hibernate 3, hilo generator multipliziert mit dem Standardwert 50. Also keine Notwendigkeit, Schrittweite DB-Sequenz. Auf der anderen Seite, spätere Versionen von hibernate verwendet-Sequenz-generator standardmäßig. Also DB-Schrittweite von 50 erforderlich ist.
https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.3/html/Migration_Guide/Preserve_the_Existing_Behavior_of_the_Hibernate_Identity_Auto_Generated_Value1.html
Hatte ich dieses Problem, das mehrere hibernate-Versionen (3 und 5). Gleiche Konfiguration geklappt hat (um 1 erhöht in DB). Aber nicht in hibernate 5. Daher update ich meine persistence.xml als unten. Dies gewährleistet hilo generation
InformationsquelleAutor der Antwort Olcay Tarazan
Wie gesagt hier, versuchen Sie Ihre
SequenceGenerator.allocationSize
mit der Datenbank-SequenzINCREMENT BY
Anzahl.InformationsquelleAutor der Antwort Anthony O.