# HSQLDB und die log-Datei



## Balian (2. Jul 2007)

Hallo Zusammen,

ich habe folgendes Problem mit HSQLDB. Wenn ich einen Datensatz in einer Tabelle speichere, dann ist dieser Datensatz im Arbeitsspeicher bereits vorhanden und wird nach ein paar Sekunden in der HSQLDB.log gespeichert.

Wenn man nun aber einen Datensatz im Programm eingibt, diesen speichert, das schnell Programm beendet und schnell neu startet, kann dieser Datensatz verloren gehen, da es der Datensatz aus dem Arbeitsspeicher nicht mehr in die log-Datei geschafft hat.

Hatte Jemand schon die Problematik oder kann mir Jemand etwas Allgemein dazu sagen?

Danke und Gruß

Balian


----------



## The_S (3. Jul 2007)

Wie wärs mit Datenbank via Shutdown sauber runterfahren?


----------



## Gast (3. Jul 2007)

Das mache ich wirklich...... Hat den Keiner eine solche Verzögerung bei sich entdecken können? Hm.....


----------



## HoaX (3. Jul 2007)

tja, sowas kann passieren. wieso auch nicht? wenn man es verhindern könnte würde kein dateisystem mehr zerbröseln wenn mal plötzlich der strom weg geht ...

es wäre sinnvoller daran zu arbeiten dass das programm nicht "abkackt" als sich um sowas gedanken zu machen.


----------



## Gast (4. Jul 2007)

Also, ich schaue mir meinen Code nochmal genau an.  :### Das Programm steigt nicht aus. Ich beende ganz normal mit shutdown() usw... 

Nur nochmal zur Sicherheit, was mein Problem ist. Ich trage einen Datensatz in die Datenbank ein und diesen Datensatz müsste ich theoretisch nach einer Sekunde auch in der log-Datei sehen. Tut er aber nicht. Warte ich 10, 15 Sekunden ist er in der Log-Datei. Nun habe ich erst gedacht, das der Insert zu langsam ist, aber ein einfache Ausgabe auf der Konsole nach dem Insert kommt sofort nach Absenden des Inserts.

Ein weiteres Beispiel: Beim ersten Starten der Anwendung lege ich eine Datenbank an und tragen in einer Tabelle bereits einen Datensatz pro Tag ein. Heisst also 365 Datensätze, die über eine Schleife in die Datenbank eingetragen werden. Knapp 300 Sätze sehe ich sofort in der Log-Datei, die anderen 65 erscheinen erst 10,15 Sekunden später in der Log-Datei.

Das ihr das bei Euch nicht nachvollziehen könnt, muss irgendwo bei mir im Quellcode etwas nicht sauber sein. Ich schaue mir das heute Abend nochmal an. Vielleicht finde ich ja etwas.  :roll: 

Gruß


----------



## The_S (4. Jul 2007)

ja, ich hatte noch nie Probleme mit HSQLDB


----------



## HoaX (4. Jul 2007)

wie kommst du darauf dass es sofort drinen stehen sollte?


----------



## Gast (4. Jul 2007)

Also, tatsächlich habe ich das Problem nur dann, wenn ich mein Programm über den x-Button schliesse. Bedeutet, es wird kein ordentlicher shutdown gemacht. Wie kann ich an 


```
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
```

dranhängen, das eine Methode aufgerufen wird? Natürlich die Shutdown-Methode... 

Danke und Gruß

@Hoak - Ich bin einfach davon ausgegangen, aber Du hast Recht, dass würde enorm Performence kosten, wenn hSQLDB das bei jeder Änderung und einem großen Datenbestand machen würde.


----------



## merlin2 (4. Jul 2007)

Gast hat gesagt.:
			
		

> Also, tatsächlich habe ich das Problem nur dann, wenn ich mein Programm über den x-Button schliesse. Bedeutet, es wird kein ordentlicher shutdown gemacht. Wie kann ich an
> 
> 
> ```
> ...




```
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
//Aufräum-Befehle;
System.exit(0);
}});
```


----------



## HoaX (4. Jul 2007)

so mach ich das:


```
private static void addShutdownHook() {
        Runtime.getRuntime().addShutdownHook(new Thread("hsqldb shutdown") {
            @Override
            public void run() {
                try {
                    Session session = sessionFactory.openSession();
                    Statement st = session.connection().createStatement();
                    st.execute("shutdown");
                    st.close();
                    session.close();
                    System.out.println("SHUTDOWN executed");
                } catch (HibernateException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        });
    }
```

btw ist das verhalten bei hsqldb dokumentiert!


----------



## Gast (4. Jul 2007)

Danke für die Hilfe, einen shutdown-Methode aber cih schon, nur nicht mit dem X-Button verbunden.

Naja, auf den WindowsAdapter hätte ich auch kommen müssen, naja.... :wink:  Danke


----------

