Funktionsaufruf beim Beenden von Java Proggrammen über das Betriebssystem?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Funktionsaufruf beim Beenden von Java Proggrammen über das Betriebssystem?

    Hallo!

    Ich habe folgendes Problem. Bei einem Java Programm das auf eine SQL Datenbank zugreift, möchte ich sicherstellen, dass die Verbindung zu dieser beim Beenden des Programms auf jeden Fall korrekt geschlossen wird ("myConnection.close()").

    Wenn das Programm vom Benutzer über das Programmfenster oder den entsprechenden Menüeintrag beendet wird, kann ich vor dem Aufruf von "System.exit(0) problemlos die Datenbankverbindung schließen. Allerdings funktioniert das natürlich nicht, wenn der Benutzer das Programm mittels "Apfel+Q" oder über das Dock beendet.

    Jetzt habe ich zwar EventListener von Apple gefunden die QuitEvents vom MacOS Abfangen, nur würde ich das ganze gerne plattformunabhängig lösen. D.h. möglichst so, dass es auch dann funktioniert wenn der Benutzer unter Windows "alt+F4", oder unter Linux "ctrl+C" drückt.

    Versucht habe ich es schon mit Überschreiben der finalize() Methode, aber irgendwie dürfte das beim Beenden über das System nicht so recht funktionieren (möglicherweise wird da einfach die JVM beendet, ohne das Programm vorher ordentlich zu beenden - ich weiß nicht??

    kann mir hier jemand weiter helfen? bin leider noch lange kein Profi ;)
    tausend dank und servus
    booster
  • RE: Funktionsaufruf beim Beenden von Java Proggrammen über das Betriebssystem?

    Ich bin der festen Überzeugung, das nach dem Ende eines Programms auch diese Verbindung nicht weiter offen bleibt.

    Generelle solltest Du dann mal überprüfen, wie lange Deine Verbindungen so offen sind, da SQL-Verbindungen in Java in der Regel ein Time-out haben. Eigentlich sind die Verbindungen nicht dazu gedacht, über einen Funktionesaufruf offen zu bleiben. falls du sehr viele Verbindungen benötigst, verwende besser einen Connection-Pool.
  • > Ich bin der festen Überzeugung, das nach dem Ende eines Programms auch diese Verbindung nicht weiter offen bleibt.

    das ist wahr, soll sie ja auch nicht. In meinem Fall verhält es sich etwas spezieller. Ich verwende HSQLDB (hsqldb.sourceforge.net) im Standalone Modus. Das heißt die Datenbank ist direkt im Programm integriert und wird mit diesem gestartet und beendet. Der Zugriff darauf erfolgt zwar über JDBC aber OHNE (!) Netzwerkverkehr (auch nicht lokal) sondern direkt über die entsprechenden Programmklassen.
    Wird die so laufenden DB beendet, wird sie angeblich (laut Dokumentation) auch richtig abgeschalten (eben nach dem die letzte Verbindung ungültig ist).

    Das Problem ergibt sich aber daraus, dass ich außerdem eine Möglichkeit vorsehen will, dass das laufende Programm gleich als DB-Server für einen (oder mehrere) weitere Clients dienen kann. Dabei läuft die DB als echter Datenbank-Server, sollte aber trotzdem beim Beenden des (Haupt)Programms richtig geschlossen werden.

    Im Prinzip brauche ich also nur eine Verbindung die während der Laufzeit offen bleibt (für den Standalone Modus) und die Möglichkeit beim Beenden des Programms ein "SHUTDOWN" Statement auszuführen.

    danke und servus
    booster
  • Du bekommst aber nicht jedes mögliche Ende in einem Programm übermittelt.
    Versuch mal, den Prozess in einem Thread laufen zu lassen und fange eine InterruptedException ab, in der finally-Clause kannst Du dann die Verbindung schliessen.
    Das klappt aber auch nicht in allen Fällen. Richtig 'harte' Abbrüche können Dir trotzdem durch die Lappen gehen.
  • Bei Apple gibt es ein Sample 'OSXAdapter', das zeigt, wie Du dynamisch versuchen kannst, die OS X Features zu nutzen, ohne die Portabilität zu verlieren, damit bekommst Du zumindest auf unserer Lieblings-Plattform das Ende einer Anwendung mit.

    Ansonsten fallen mir nur Threads ein. nimm Zwei, die miteinander kommunizieren, mach den einen zu einem Deamon-Thread, dann endet er mit der Anwendung, der andere lebt länger, dann kannst Du die Verbindung abbauen.

    Falls Du das hinbekommst bleibt nur noch die Frage, wieso die Jungens von der DB es nicht einfach übernehmen.
  • Danke, den OSXAdapter werde ich mir mal ansehen. Wie man das Beenden einer Java Anwendung unter OS X mitbekommt habe ich ja schon herausgefunden - aber leider ohne plattformunabhängig zu bleiben.

    Den Tipp mit den 2 Thread habe ich auch schon im Macnews Forum bekommen, ich weiß zwar noch nicht wie ich das anstellen soll (bin ja noch fast blutiger Anfänger) - aber damit werde ich mich auf jeden Fall beschäftigen. Immerhin ist das der einzige Hinweis der mir bisher möglich erscheint (von meinem Wissensstandpunkt aus)

    Und zu den DB Jungens:
    Im Prinzip "sollte" die DB auch kein Problem damit haben, einfach abgewürgt zu werden. Die Integrität der Daten soll dabei erhalten bleiben usw. Trotzdem wäre es mir lieber, wenn ich sie immer sauber beenden könnte, ich bin ja nicht bei M$ ;)

    Danke jedenfalls mal für die Anregung, mal sehen ob ich das hin bekomme.

    servus
    booster