# Datenbank schließen



## AcridMusak (28. Aug 2013)

Hi Leute, 

hab nen kleines Problem mit dem Schließen einer Datenbankverbindung. Mir ist klar wie ich über connection.close() die Datenbank schließe, allerdings sollte die Verbindung auch geschlossen werden, wenn beispielsweise irgendwelche Fehler beim Server oder mit der JVM auftreten.
Es ist so, dass ich ein JSF Projekt habe mit Apache Tomcat 7, bei dem natürlich Daten in einer Postgre Datenbank persistent gespeichert werden sollen. Wenn der Server (oder besser die Applikation) gestartet wird, wird eine Datenbankverbindung aufgebaut. Wenn jetzt aus irgend einem Grund die Anwendung beendet wird, dann muss auch die Verbindung beendet werden, egal ob die Anwendung regulär heruntergefahren wird oder der Server, oder gar die JVM gekillt wird.
Wie kann ich so etwas bewerkstelligen?

Gruß


----------



## mfernau (28. Aug 2013)

Dann meinst du so etwas wie einen ShutdownHook
-> Galileo Computing :: Java ist auch eine Insel – 14.8 Einen Abbruch der virtuellen Maschine erkennen

Damit kannst Du Deine Ressourcen normal freigeben und Dein System entsprechend herunter fahren lassen.
Der Shutdown-Hook wird z.B. angesprochen, wenn mit einem üblichen SIGTERM (Posix) die VM beendet wird. Er wird natürlich nicht angesprochen, wenn die VM mit einem SIGKILL regelrecht abgewürgt wird. Dann ist aber eh alles Sinn- und Zwecklos.
Unter Windows würde die VM z.B. beim herunterfahren des System mit einem SIGTERM die Chance bekommen sich zu beenden. In einer consolenanwendung hat ein STRG+C denselben Effekt. Wohingegen ein "Prozess Beenden" im Task-Manager deine VM einfach tötet.

HTH
Martin


----------



## AcridMusak (28. Aug 2013)

Ok darüber bin ich auch schon gestoßen,
arbeitest du mit Eclipse? Da ist es so, dass es einen Stopbutton gibt, sowohl bei der Serversicht, als auch in der integrierten Konsole. Allerdings gibt es bei diesen beiden einen Unterschied, bei der Serversicht fährt man den Server normal runter, wenn man allerdings bei der Konsole diesen Button betätigt würgt man die JVM einfach ab, allerdings muss ich dafür sorgen, das bei beiden Fällen die Datenbankverbindung vernünftig runtergefahren wird, weißt du ob ich das mit dem ShutdownHook realisieren kann?


----------



## mfernau (28. Aug 2013)

Das mit dem STOP-Button im Eclipse ist so ne Sache. Mir ist dort auch schon aufgefallen, dass das Drücken des STOP-Buttons meinen shutdown-Hook nicht anspricht. Die VM wird da vermutlich anders abgewürgt.
Ich hab damals auch schon etwas gegoogelt und kam zu keinem wünschenswerten Ergebnis
-> java - ShutdownHook in eclipse - Stack Overflow

Da man üblicherweise in Eclipse nur entwickelt, habe ich mir einfach eine Krücke eingebaut. Durch das setzen einer entsprechenden Umgebungsvariable weiß ich in meiner Anwendung, dass es sich um eine Entwicklungsumgebung handelt. In diesen Fall lausche ich einfach an einem bestimmten Port nach einer Verbindungsanfrage. Möchte ich meinen Dienst beenden, baue ich einfach nur eine Telnet-Verbindung mit diesem Port auf und beende damit meinen Dienst. War für mich ausreichend.
Falls Du aber eine elegantere Lösung finden solltest würde ich mich auch dafür interessieren 

Schöne Grüße
Martin


----------



## AcridMusak (28. Aug 2013)

Ich glaub das wäre mit Kanonen auf Spatzen geschossen.
Die ganze Geschichte gehört zu einer Einführungsaufgabe, ich kann mir nicht vorstellen, dass die da soweit ausholen. Aber für den Fall, dass ich doch noch eine andere Lösung finde rühr ich mich nochmal bei dir, danke erstmal.


----------



## mfernau (28. Aug 2013)

Na ja, so ne wahnsinns Kanone ist das nun auch wieder nicht 

```
if(System.getenv("FooBar") != null) {
	new Thread(new Runnable() {
		@Override
		public void run() {
			try {
				System.out.println("Der Eclipse-Spezial Shutdown-Lauscher ist aktiv");
				ServerSocket blubb = new ServerSocket(4711);
				blubb.accept(); // Blockiert so lange bis jemand auf diesem Port eine Verbidnungsanfrage stellt
				shutMySystemDown(); // Diese Methode könnte z.B. auch vom Shutdown-Hook aufgerufen werden
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}, "Mein Eclipse-Spezial Lauscher-Thread").start();;
}
```

:toll:


----------



## AcridMusak (28. Aug 2013)

Hm, gut das hab ich nicht gewusst, dass man dies mit 16 Zeilen Code hin bekommt.
Muss mir verzeihen, bin erst im dritten Semester, von Ahnung kann man da noch nicht reden.
Danke aber für deine schnelle und aufschlussreiche Hilfe, dann werd ich mich in diese Richtungen nochmal mehr informieren.

Viele Grüße
Rudi


----------



## mfernau (28. Aug 2013)

Kein Thema und viel Spaß beim studieren  
Beste Zeit ever gewesen :applaus:


----------



## AcridMusak (28. Aug 2013)

Kann es sein, dass man bis auf das crashen der VM in JSF mit der Annotation @PreDestroy die Datenbank schließen kann?


----------

