2012-07-25 9 views
8

Ich habe diese einfache Tabelle (nur Test):In der H2-Datenbank wird das Feld auto_increment um 32 erhöht.

create table table 
(
key int not null primary key auto_increment, 
name varchar(30) 
); 

Dann führe ich die folgenden Anfragen:

insert into table values (null , 'one');// key=1 
insert into table values (null , 'two');// key=2 

in dieser Phase alles gut geht, dann schließe ich die H2-Konsole und re- öffnen und erneut auszuführen Anfrage:

insert into table values (null , 'three');// key=33 

, schließlich ist hier alle Ergebnisse:

enter image description here

Ich weiß nicht, wie dieses Problem zu lösen, wenn es ein echtes Problem ... eine Antwort vom Autor anhängige ...

+0

Welche Software verwenden Sie in Ihrem Screenshot? –

+0

Paul: Camtasia Studio. –

+0

Entschuldigung! Ich meine den Datenbank-Explorer. :-) –

Antwort

11

Die Datenbank a cache of 32 entries for sequences und Autoinkrement verwendet intern eine Sequenz implementiert. Wenn das System abstürzt, ohne die Datenbank zu schließen, sind höchstens viele Zahlen verloren. Dies ähnelt der Funktionsweise von Sequenzen in anderen Datenbanken. Es wird nicht garantiert, dass in solchen Fällen Sequenzwerte ohne Lücken erzeugt werden.

Also, haben Sie wirklich die Datenbank geschlossen? Sie sollten - es ist nicht technisch ein Problem, wenn Sie nicht, aber das Schließen der Datenbank wird sicherstellen, dass solche seltsamen Dinge nicht auftreten. Ich kann das Problem nicht reproduzieren, wenn ich die Datenbank normalerweise schließe (stoppe das H2 Console Tool). Wenn Sie alle Verbindungen schließen, wird die Datenbank geschlossen und die Datenbank geschlossen, wenn die Anwendung normal gestoppt wird (mithilfe eines Shutdown-Hooks).

Übrigens, was ist Ihre genaue Datenbank-URL? Es scheint, dass Sie jdbc:h2:tcp://... verwenden, aber ich kann den Rest der URL nicht sehen.

+0

Hallo Thomas, ich benutze diese URL: jdbc: h2: tcp: // localhost/~/autoin ... In meinem Beitrag spiele ich nur mit dem H2 Console Tool (weil ich hatte ein Fehler in meiner Software, aber ich war überrascht, als ich entdeckte, dass das Problem von H2-Datenbank nicht von JPA ist), "Ich kann das Problem nicht reproduzieren, wenn ich normalerweise die Datenbank schließe (Stoppt das H2 Console Tool)" Okay, ich habe ein Video aufgenommen in dem ich die Konsole geschlossen habe, aber immer noch das Problem besteht, siehe: http://www.youtube.com/watch?v=pGuDjgbTr7o&feature=youtu.be –

+0

Ein Video-Fehlerbericht, nett :-) Wenn Sie das Konsolenfenster geschlossen haben ' h2 - Raccourci 'um 0:53 (Ich denke, das war der Server und das H2 Console Tool, aber ich bin mir nicht sicher), ich glaube, dass der Prozess "umgefallen" ist und die Datenbank keine Chance hatte, sich selbst zu schließen wurde angerufen, die Verbindung wurde normalerweise nicht geschlossen). –

+0

Wenn dies kein technisches Problem ist, gibt es eine Chance, dieses Problem zu lösen? Ich bin in diesem Stadium fest und die Zeit läuft aus ... –

0

Terminal nicht schließen. Terminal ist der Elternprozess von h2-tcp-server. Sie sind nicht getrennt. Wenn Sie nur das Terminal schließen, schließt der Prozess alle untergeordneten Prozesse. Was bedeutet Notfall-Server-Shutdown?