JPA- Entities bleiben nach dem Löschen (unsichtbar?) in der Datenbank

Pvt. Ota

Neues Mitglied
Hallo,

ich habe folgende JPA-Entity:

Java:
@Entity
public class Test implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Lob
    public byte[] data;

}

Nun speichere ich davon z.B. 100 Einträge in der Datenbank, wobei jeder Eintrag 3 MB groß ist. Wenn ich jetzt eine Abfrage auf die Datenbank mache
Code:
(SELECT x FROM Test x)
, werden wie erwartet 100 Einträge angezeigt und die Datenbank belegt ca. 300 MB im Dateisystem.

Jetzt lösche ich alle Einträge wieder aus der Datenbank, indem ich für jeden Eintrag
Code:
entityManager.remove(test)
aufrufe.
Die gleiche SQL-Abfrage liefert nun zurück, dass die Tabelle leer ist. Die Datenbank belegt jedoch immer noch 300 MB im Dateisystem! Was läuft hier falsch? Wenn ich wieder 100 neue hinzufüge wächst die Datenbank sogar auf 600 MB und so weiter...
Erst durch ein DROP der Tabelle wird der Speicherplatz wieder freigegeben.

Ausprobiert hab ich das mit der JavaDB und Oracle XE, jeweils mit EclipseLink.

Vielen Dank für die Antworten!
 

musiKk

Top Contributor
Ich gehe mal davon aus, dass alle Transaktionen abgeschlossen sind und die Daten per SQL wirklich nicht mehr zu holen sind.

Wenn das DMBS der Meinung ist, den Speicherplatz vorhalten zu müssen, dann ist das dessen (unter Umständen gut begründete) Entscheidung. Ein Programm, welches plötzlich weniger Arbeitsspeicher benötigt, verringert auch nicht automatisch seinen Speicherverbrauch. Plattenoperationen sind performancetechnisch nochmal um einiges teurer. Wenn es wirklich wichtig ist, dass der Speicherplatz sofort freigegeben wird, würde ich mir mal die Dokumentation der jeweiligen Datenbank ansehen. In der Regel sind die ja sehr stark konfigurierbar. Das hat dann wenig mit Java zu tun.
 

parabool

Bekanntes Mitglied
bei einem remove werden die Objekte für das löschen in der DB "vorgemerkt".
In deiner Application sind die dann zwar weg aber nicht in der DB

mit einem entityManager.flush() wird es, wenn ich mich recht erinnere, mit der Datenbank synchronisiert.
 

Pvt. Ota

Neues Mitglied
Danke für die Antworten!
Ich gehe mal davon aus, dass alle Transaktionen abgeschlossen sind und die Daten per SQL wirklich nicht mehr zu holen sind.
Ja, das ist der Fall.

Hm, aber sollte er den Speicherplatz dann nicht irgendwann mal freigeben, wenn ich immer wieder lösche, hinzufüge, lösche, ...? Die Datenbank macht bei mir den Eindruck, als wolle sie ins Unendliche wachsen... Oder muss ich mich dann wirklich immer selber darum kümmern, dass der Speicherplatz freigegeben wird?

@parabool: Ein flush() hab ich auch schon hinter das remove() gesetzt. Das ändert aber leider auch nichts.
 

musiKk

Top Contributor
Hm, aber sollte er den Speicherplatz dann nicht irgendwann mal freigeben, wenn ich immer wieder lösche, hinzufüge, lösche, ...? Die Datenbank macht bei mir den Eindruck, als wolle sie ins Unendliche wachsen... Oder muss ich mich dann wirklich immer selber darum kümmern, dass der Speicherplatz freigegeben wird?

Ich würde mich nicht drum kümmern, wenn es keine Probleme bereitet. Klar kann es auf beschränkten Geräten (Buzzword Embedded Systems) vorkommen, dass der Speicher zu schnell knapp wird. Dann muss man sich auf jeden Fall Gedanken darum machen. In allen anderen Fällen sollte der Speicher natürlich irgendwann freigegeben werden oder zumindest nicht mehr wachsen.

Wie gesagt: Das wird dann sehr datenbankspezifisch. Datenbanken werden mit irgendeiner Standardkonfiguration ausgeliefert und müssen bei Bedarf stark an die eigenen Bedürfnisse angepasst werden (aus meinen Erfahrungen: MySQL bietet verschiedene Profile, PostgreSQL ist zu Beginn sehr konservativ). DB Tuning ist ein großes Gebiet.

Vielleicht bietet das spezielle DBMS ja auch eine Funktion an, mit der ein Aufräumen des Speichers angestoßen werden kann. Bei PostgreSQL gibt es z. B. [c]VACUUM[/c].
 

parabool

Bekanntes Mitglied
Zuletzt bearbeitet:

California

Aktives Mitglied
Kein Filesystem macht Dateien kleiner...
Beim Schreiben hast Du den Tablespace vergrößert, die Daten müssen schliesslich irgendwo stehen.
Beim Anlegen war dein Tablespace vielleicht 10 Kb gross -> Definition und leerer Index
Dann hast Du Daten reingeschrieben -> 300 Kb -> Definition, gefüllter Index, Daten
Dann hast Du gelöscht -> die DB markiert die Daten "zum Überschreiben" und leert den Index, physikalische(!) Dateigröße bleibt
Wenn Du jetzt wieder Daten schreibst, kann es sein, dass dein Tablespace NICHT grösser wird (je nach Strategie der DB)
Wenn Deine Datenbank eine "Shrink" oder "Reorg" Methode kennt, DANN wird ein neuer Tablespace mit den aktuell vorhandenen Daten "kopiert", der ist dann kleiner.
Dieses "Shrink" oder "Reorg" oder so musst Du vom Administrationswerkzeug der DB aus aufrufen, die DB ist solange offline!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Entities mit Vererbung Datenbankprogrammierung 12
T Tabellen von nicht mehr vorhandenen Entities werden generiert Datenbankprogrammierung 0
M MySQL probleme beim "Generate Tables from Entities" Datenbankprogrammierung 9
C Entities zwischen zwei PersistenceUnits tauschen Datenbankprogrammierung 5
megachucky JPA: Problem bei Mischung von nicht persistenten und bereits persistenten Entities Datenbankprogrammierung 3
M JPA Entities nicht thread safe? (Hibernate) Datenbankprogrammierung 9
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
T JPA: Nach String statt Primärschlüssel suchen Datenbankprogrammierung 9
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
S MySQL JTable zeigt nach Datenbankabfrage eine Spalte zu viel an Datenbankprogrammierung 0
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
M SQLite Suche nach String Datenbankprogrammierung 4
G PostgreSQL Nach Monaten auf einmal ClassNotFound-Exception Datenbankprogrammierung 3
C MySQL JTable in JScrollPane nach insert aktualisieren Datenbankprogrammierung 3
J SQLite Datenverlust nach beenden des Programmes Datenbankprogrammierung 21
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
B Leerzeichen nach Umlaut -> Sichtbar erst nach Query! Datenbankprogrammierung 6
D Zeit von SQL nach Java Datenbankprogrammierung 2
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
AssELAss Oracle Suche nach Umlauten Ä und Ae ermöglichen Datenbankprogrammierung 11
G HSQLDB Inserts/Updates sind nach Neustart der Anwendung Datenbankprogrammierung 1
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
Z PDF nach Formate sortieren Datenbankprogrammierung 3
A Nach Export mysql Verbindung zur Datenbank nicht möglich, was tun? Datenbankprogrammierung 7
F Java SQL Syntax Error erst nach mehrmaligen Aufrufen Datenbankprogrammierung 3
R vor/nach INSERT mysql-SETS absetzen Datenbankprogrammierung 2
C Programm wird nach DB-Eintrag nicht weitergeführt Datenbankprogrammierung 5
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
S Nochmals: ID ermitteln nach Insert Datenbankprogrammierung 2
GianaSisters MS SQL unter Netbeans OK - nach konvertieren Absturz Datenbankprogrammierung 6
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
M Datenbankeintrag bleibt nach Löschen in JSP vorhanden Datenbankprogrammierung 8
0 Filtern nach mehreren Kriterien Datenbankprogrammierung 4
T filtern nach expliziten Worten trotz LIKE '%Wort%' Datenbankprogrammierung 2
E Nach Server wechsel Datenbank fehler ?!? Datenbankprogrammierung 3
F SQL ordnen nach zueinander in Verhältnis gesetzten Spaltenwerten Datenbankprogrammierung 11
J SQL: Sortierung nach Wortlänge Datenbankprogrammierung 2
Java.getSkill() Datensatz / Tupel automatisch nach xy Tagen / Stunden löschen Datenbankprogrammierung 7
T JPA: NullPointerException nach persist Datenbankprogrammierung 3
T Eintragung in einer Spalte nach Abfrage Datenbankprogrammierung 11
E Hibernate Session closed nach Transaction commit? Datenbankprogrammierung 7
K Rundungsfehler bei Gleitkommazahlen von Java nach SQL Datenbankprogrammierung 2
B Spaltennamen von MySQL Datenbank nach Java auslesen Datenbankprogrammierung 10
alexpetri Problem mit jdbc MS Access / nach 670 inserts ist schluss. Datenbankprogrammierung 4
tfa Apache DBCP: Reconnect nach Timeout? Datenbankprogrammierung 3
M mySQL zugriff funktionert nach ca4 stündiger laufzeit nicht Datenbankprogrammierung 6
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M sql-code für suche in tabelle nach höchster transaktionsnr Datenbankprogrammierung 12
T ibatis + "generated p-key" nach insert? Datenbankprogrammierung 24
G Herausfinden des Primary Keys nach INSERT-Kommando? Datenbankprogrammierung 4
T Tabellen aus Datenbank 1 nach Datenbank 2 Datenbankprogrammierung 2
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
G Suchen nach Autowerten in Access-DB Datenbankprogrammierung 20
D JAVA hängt nach SQL Abfrage Datenbankprogrammierung 7
I Nach export zur .jar keine verbindung mehr Datenbankprogrammierung 7
M Datenbankverbindung bricht nach ca. 12 Stunden Verbindung ab Datenbankprogrammierung 3
R Nach String in MySQL datenbank suchen Datenbankprogrammierung 7
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
G File nach Blob konvertieren ? Datenbankprogrammierung 6
M Abfrage trennt Ergbnis eines Atrributes nach den Leerzeichen Datenbankprogrammierung 4
F Treiber nachladen oder nach Bedarf Datenbankprogrammierung 4
P Primärschlüssel direkt nach der Eingabe wieder auslesen Datenbankprogrammierung 7
R MySQL Syntax für suche nach Textteil Datenbankprogrammierung 8

Ähnliche Java Themen


Oben