Mehrere Java-Anwendungen, die auf eine HSQLDB zugreifen, lassen die App hängen

8

Dies ist halbbezogen zu meiner vorherigen Frage . Wie in der vorherigen Frage angegeben, habe ich eine Desktop-App, die zu einer anderen Main-Methode aufruft, die einen bestimmten Prozess startet. Sowohl die Desktop-App als auch die separate Main-Methode greifen auf dieselbe HSQLDB-Datenbank zu.

Bevor ich so weit kam, hatte meine Desktop-App gerade auf die HSQLDB-Datenbank mit einer Verbindungs-URL wie der folgenden zugegriffen:

%Vor%

Dies funktioniert jetzt in einer einzelnen Benutzerumgebung. Jetzt, da ich eine Multi-User-Umgebung mit der Desktop-App und dem separaten Main-Prozess habe, der diese Datenbank lesen / schreiben möchte, wollte ich diese Datenbank zu einer freigegebenen Ressource machen.

Ich habe mir die HSQLDB-Dokumentation angesehen und diesen Beitrag über Erstellen einer gemeinsamen HSQLDB-Datenbank , aber ohne Erfolg.

In der Post geht es darum, den Server per Code zu starten. Ich denke nicht, dass dies das ist, was ich tun möchte, da ich die HSQLDB-Datenbank immer in Betrieb haben möchte, da es mehrere Benutzer der Desktop-App geben kann.

Wenn Sie sich die offizielle HSQLDB-Dokumentation ansehen, können Sie einen HSQLDB-Server wie folgt starten:

%Vor%

Wenn ich den obigen Befehl mit meiner eigenen Datenbankdatei und meinem Namen ausführe, scheint es in Ordnung zu starten:

%Vor%

Ich habe dann meine Verbindungs-URL folgendermaßen geändert:

%Vor%

Das scheint bei mir nicht zu funktionieren. Irgendwelche Ideen, was ich falsch gemacht habe oder was mir fehlen könnte?

Wenn die Desktop-App die externe Main-Methode aufruft, hängt die Desktop-App darüber hinaus ab, da die externe Main-Methode feststellt, dass die Desktop-App anscheinend eine Sperre für die Datenbank aufweist. Sobald ich die Desktop-App heruntergefahren habe, macht die externe Main-Methode tatsächlich das, was ich von ihr erwartet habe.

    
digiarnie 01.12.2010, 00:01
quelle

3 Antworten

10

Mit jdbc:hsqldb:file:/some/path/myDatabase erstellen Sie eine In-Process-Datenbank, so dass diese nicht (im Idealfall) zwischen mehreren JVM geteilt werden sollte, jedoch gibt es einen Weg gemäß Anleitung

  

"In 1.8.0 können Sie einen Server ausführen   Instanz in einem Thread von der gleichen   virtuelle Maschine als Ihre Anwendung   und bieten externen Zugriff auf Ihre   In-Prozess-Datenbank. "

imho, besser wäre es, im Server-Modus in separaten jvm zu starten.

update :

Überprüfen Sie, ob der hsqlsdb-Server gestartet wird:

%Vor%

stimmt mit dem Aliasnamen in der Treiber-URL überein

%Vor%

In diesem Fall gab es keinen Alias. Ich habe das gerade getestet und es funktioniert gut.

    
kunal 01.12.2010, 00:40
quelle
4

Die Antwort von @kunal ist korrekt. Aber Sie haben eine Datei server.properties, die die folgenden Einstellungen enthalten kann:

%Vor%

Verwenden Sie entweder die Datei server.properties für Einstellungen oder alternativ die Befehlszeile. Benutze nicht beide.

Sobald Sie den Server gestartet haben, kann die Desktop-App keine Verbindung mehr zur Datenbank mit der jdbc:hsqldb:file:/some/path/myDatabase URL herstellen. Es muss sich mit der jdbc:hsqldb:hsql://localhost/xdb URL verbinden.

HSQLDB verfügt über eine generische Lösung zum Aufrufen der Hauptmethode für einen anderen Prozess. Verwenden Sie diese Klasse, um einen beliebigen Prozess aufzurufen. MainInvoker-Klassenquelle

    
fredt 01.12.2010 11:28
quelle
2

Ich hatte ein ähnliches Problem, eine Anwendung schreibt in hsqldb und eine andere liest daraus.

Ich habe alles gelöst, ohne Server zu verwenden. Ich habe nur einige Konfigurationen verwendet, die hier gefunden wurden .

Ich habe folgende Eigenschaften hinzugefügt:

  • Anwendung, die schreibt:
    • readonly = false
    • hsqldb.lock_file = false
  • Anwendung, die nur liest:
    • readonly = true
Paul 10.03.2016 16:08
quelle

Tags und Links