# Hsqldb dauerhaft aus Java heraus starten



## HSQLDB User (7. März 2010)

Hallo Community,

ich möchte eine Hsqldb aus Java heraus starten. Das habe ich auch mit Hilfe der properties-datei hinbekommen. Was ich allerdings nicht hinbekomme, ist dass die DB auch nach der Laufzeit der Java-Klasse weiterhin besteht. Ich hab das mal mit einer Endlosschleife probiert, dann kann ich auch auf die DB zugreifen. Das scheint mir allerdings keine besonders tolle Lösung zu sein ...

Vielen Dank im Vorraus!


----------



## zerix (7. März 2010)

Hallo,

ich verstehe noch nicht so ganz was du tun möchtest. 
Möchtest du HSQLDB als Server starten oder embedded nutzen?

Könntest du mal deinen Code zeigen wie du das getan hast?

Gruß

Sascha


----------



## HSQLDB User (7. März 2010)

Hallo,

ich möchte die HSQLDB als Server starten. Ich probiere gerade das ZK Framework aus (http://www.zkoss.org/). Die Anwendung läuft auch, wenn ich die DB über die Konsole anschmeiße (die Konsole muss dann allerdings geöffnet bleiben):

java -cp ./hsqldb.jar org.hsqldb.Server -database.0 file:runningEvents -dbname.0 runningEvents

Nun mein Versuch die DB aus der Applikation heraus dauerhaft zu starten:

public class InitHsqldbServer implements Initiator {

[...]
	@Override
	public void doInit(Page arg0, Map arg1) throws Exception {
		Server server = new Server();
		boolean read = server.putPropertiesFromFile("server");

		if(!read) {
			throw new Exception();
		}

		server.start();

		server.checkRunning(true);

	}
}

Die zugehörige properties Datei (server.properties):

server.port=9001
server.database.0=file:runningEvent
server.dbname.0=runningEvent


----------



## HSQLDB User (7. März 2010)

Die DB heißt natürlich jeweils runningEvents mit "s" (Fehler in der properties Datei).

Hier noch die hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="hibernate.connection.url">jdbc:hsqldb:hsql://localhost/runningEvents</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>

        <property name="hibernate.hbm2ddl.auto">update</property>

        <property name="current_session_context_class">thread</property>

        <mapping class="running.Event"/>
    </session-factory>
</hibernate-configuration>


----------



## Thomas Darimont (7. März 2010)

Hallo,

wenn du den HSQLDB Prozess unabhängig von "deinem" Java Prozess weiter laufen lassen möchtest so wäre eine Möglichkeit den HSQLDB Prozess aus deiner Java Anwendung heraus als neuen Prozess zu starten:


```
package de.tutorials.training;

import java.io.File;

public class Bootstrap {
  public static void main(String[] args) throws Exception {
    String command = "cmd /c start \"HSQLDB Process\" java -cp ./hsqldb-1.8.0.10.jar org.hsqldb.Server -database.0 file:runningEvents -dbname.0 runningEvents";
    ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
    processBuilder.directory(new File("c:/temp"));
    processBuilder.redirectErrorStream(true);
    Process process = processBuilder.start();
  }
}
```

Damit läuft der HSQLDB Prozess auch weiter, wenn "dein" Java Prozess schon beendet ist.
Bei mir bleibt der Java Prozess unter Eclipse (64 Bit JDK / Windows 7) "hängen" so lange der HSQLDB Prozess noch läuft.
Führt man obigen Code über die Konsole aus, so wird der startende Java Prozess, wie gewünscht,  gleich wieder beendet. 
Der HSQLDB Prozess läuft noch weiter.


Gruß Tom


----------



## HSQLDB User (7. März 2010)

Hallo Tom,

danke für deine Lösung. Diese werde ich morgen mal ausprobieren. Muss sie nur noch für Ubuntu umschreiben (viell. hast du da auch eine Idee?). Man muss da ja dann die Shell aufrufen ...

Einen schönen Sonntag abend noch,
Stefan


----------



## HSQLDB User (10. März 2010)

Hier meine Lösung (habe es leider nicht mit der ProcessBuilder Variante unter Ubuntu hinbekommen):

Ich habe die auszuführende Kommandozeile

"java -cp ./hsqldb.jar org.hsqldb.Server -database.0 file:runningEvents -dbname.0 runningEvents"

in ein Skript gepackt und starte dies wieder von der Konsole aus. Der Trick nun dabei ist, dass ich das &-Zeichen ans Ende der Zeile setze:

sh> startHsqldb &

Somit wird ein Hintergrundprozess gestarten und ich kann die Konsole schließen, ohne das der Hintergrundprozess beendet wird. Der Server läuft also weiter ... 

"bash lets you run one or more tasks in the background, and selectively suspend or resume any of the current tasks (or "jobs"). To run a task in the background, add an ampersand (&) to the end of its command line"


----------

