2012-12-17 14 views
5

Ich verwende eine HSQLDB-Datenbank in Java, die Dateien in einer Spalte speichert, die als BLOB definiert ist.HSQLDB und .lobs Dateigröße

Wenn ich eine Tabellenzeile mit einer Datei/BLOB zu meinem Tisch der .lobs Datei steigt in Größe der Datei/BLOB hinzuzufügen. Wenn ich meiner Tabelle eine weitere Datei hinzufüge, wird sie wieder größer (2 x BLOB-Größe).

So setzte ich ein Testverfahren, das 10-mal iteriert und schreibt die gleiche Datei an meinen Tisch und löscht sie direkt nach dem Einsatz.

Nun, meine .lobs Datei ist 10 x Dateigröße ... obwohl ich alle Tabellenzeilen gelöscht haben, die die Datei enthalten.

Ich habe versucht, CHECKPOINT DEFRAG auszuführen, aber nichts passiert. Die .lobs-Datei behält die gleiche Dateigröße bei.

Das macht mir Sorgen, da meine Webapp ich gerade viele Dateien in meine Datenbank schreiben werde und selbst wenn die Tabellenzeilen mit der Datei (BLOB) nach einer Weile gelöscht werden, wird die .lobs Datei immer oder zunehmen Bleiben Sie in der gleichen Größe und essen Sie schließlich alle meine Speicherplatz.

Fehle ich einige Einstellung oder ist dies das erwartete Verhalten von HSQLDB und BLOBs?

Vielen Dank!

Mit freundlichen Grüßen Andreas

Antwort

1

Das ist normal.

Alle gelöschten LOB-Bereiche werden aufgezeichnet. Nach einem CHECKPOINT werden die Leerzeichen wiederverwendet, wenn Sie neue Lobs einfügen.

In einer Produktionsdatenbank gibt es wiederkehrende Zyklen von Einfügen und Löschen. Im Protokolllauf wird die Dateigröße .lobs die tatsächliche Größe der Lobs in der Datenbank nicht um einen sehr großen Betrag überschreiten.

Update:

Der Grund für .lobs Datei zu wachsen, bis ein Checkpoint Datenrettung ist in Fall, damit es ein Systemabsturz ist.

HSQLDB Version 2.3.0 und späteren Versionen gestutzt die .lobs Datei auf CHECKPOINT wenn es leeren Raum befindet sich am Ende der Datei nach dem Lobs zu löschen.

+0

Hmm, ich habe einen weiteren Test gemacht. Ein BLOB eingefügt und direkt danach gelöscht. Hat dies für 1000 Iterationen und die Größe von BLOB ~ 8 MB. Ergebnis: Eine .lobs-Datei von ~ 9 GB Ereignis, obwohl keine Daten in meiner Datenbank sind. – andreas78

+0

... Fortsetzung ... ich meinen Server-Slot in der Cloud zu kaufen und jedes MB Platten kostet mich Geld, das ich die .lobs Datei Zuteilung 9 GB Daten wirklich nicht mag, wenn meine Datenbank leer ist. Ich denke, die Datei .lobs würde in diesem Szenario nie mehr als 8 MB, da ich das BLOB hinzufügen und dann das gleiche BLOB löschen. Warum erhöhen Sie die .lobs-Datei um mehr als 8 MB, wenn ich nie mehr als 8 MB gleichzeitig speichere? – andreas78

+0

Nach dem Ausführen der gleichen Testsuite mit H2 kann ich Folgendes angeben: H2 verwendet maximal ~ 1 GB zum Einfügen von 1000 x 8 MB-Dateien in der DB-Datei. H2 beim Hinzufügen und direkt nach dem Löschen verwendet ~ 68 MB in der DB-Datei. H2 beim Löschen der Datenbank/Tabelle reduziert die Größe der Datenbankdatei. Das lässt mich denken, wenn H2 eine bessere Wahl ist, wenn ich Speicherplatzverbrauch verringern möchte. – andreas78