# Derby ein zweites mal als Read-only öffnen



## Stinner (28. Sep 2009)

Hallo,
habe eine Desktop-Anwendung geschrieben, in der in Derby nutze.

Jetzt soll die Anwendung auf ein Netzlaufwerk und mehreren Leuten zugänglich gemacht werden.
Ich nutze den EmbeddedDriver von derby und es klappt alles wunderbar.

Allerdings lässt sich derby nicht 2 mal starten. Momentan habe ich es so gelöst, dass ich eine Meldung anzeige, dass die Datenbank bereits genutzt wird, falls ein anderer Anwender versucht die Anwendung ein zweites mal zu starten.

Es wäre aber schön, wenn sich die Anwendung nochmal öffnet, in einer Read-only mode. In dem Handbuch finde ich zu dem Thema immer nur, dass mit derby read-only DBs erstellen kann, wenn man sie in eine jar packt etc..

Aber das ist ja nicht das was ich will. 

Kann mir jmd sagen, ob es möglich ist, die Anwendung ein zweites mal im Read-only zu starten und wo ich dazu was nachlsesn kann?

GRuß


----------



## vogella (4. Okt 2009)

Hallo,

geht meines Wissens nicht. Wenn Du im Embedded Mode arbeitest, dann kann nur einer drauf zugreifen. 

Ich hatte das gleiche Problem vor einiger Zeit und hatte es dann so gelöst, daß wenn User 1 die DB fertig gelesen hatte ich die Verbindung komplett getrennt hatte (shutdown=true im Connection String). Damit konnte dann der nächste User die DB starten. Beim Speichern habe ich dann die Verbindung wieder geöffnet, usw.

Somit konnte zwar wieder nur ein User zur selben Zeit auf die DB zugreifen, aber zumindestens konnten mehrere gleichzeitig mit der DB arbeiten.

War aber letztendlich doch nur ein wilder Hack und ich habe letztens auf Derby im Server mode umgestellt. Da ist sehr viel schöner. Wenn Du irgendwo einen Rechner herumstellen hast, würde ich das lieber machen.


----------



## Stinner (14. Okt 2009)

hi,
hat es lange gedauert den Server Treiber einzubauen?
Muss mal schauen, was ich alles ändern müsste.

Habe schon versucht die 3 Schichten in meiner Applikation einzuhalten. Müsste ja nur 
Änderungen auf der DB Ebene geben.


----------



## vogella (14. Okt 2009)

Der Aufwand in meinem Fall war einen Rechner zu finden, der mir als Server dient. Und dann mußte ich noch herausfinden, wie man Derby als Windows Service started.

Da hast Du es einfacher, da ich das hier beschreibe: Apache Derby Database - Tutorial

Ansonsten, mußt Du nur das jar austauchen und den anderen Treiber in Deinem JDBC Aufruf nehmen. Das ist ne Sache von 2 Minuten.


----------



## Stinner (4. Nov 2009)

Könnte ich hier nochmal nachfragen.
Hatte das Problem hinten ran gestellt, will es aber jetzt doch machen.

Situation ist die, dass wir hier alle auf einen Server zugreifen, ich jedoch nicht Admin rechte habe. wird halt als netzlaufwerk genutzt.
Dort würde ich jetzt gerne Derby im Server/Client starten. 
Brauche ich dann 2 Applikationen oder kann ich den Client/Server in einer 
Apllikation machen und trotzdem die Datenbank im Read Only öffnen?

Habe noch nix mit Client/Server gemacht und trau mich da nicht so einfahc ran....


----------



## vogella (4. Nov 2009)

Ja, so war es bei mir auch. Ich hatte nur eine ein Netzwerklaufwerk. Dann geht eben Derby auch nur mit einem User, oder Du machst nach dem Aufbau von User 1 einen harten shutdown von Derby (shutdown=true im JDBC Connectionstring). 

Besser ist wirklich Derby im Servermode laufen zu lassen. Schau Dir mal mein Tutorial ( Apache Derby Database - Tutorial ) an, damit sollte das relativ einfach sein. Kannst gerne nachfragen, ich passe dann das Tutorial an. ;-)

Zum Testen kannst Du direkt auf dem Server Derby mit startNetworkServer starten. Später solltest Du dann daraus einen MS Service machen. Ist beides im Tutorial beschrieben.


----------



## Stinner (4. Nov 2009)

Hi,
habe das Tutorial durchgelesen.
Wenn ich das richtig verstanden habe. 
Um derby im client/server bei mir laufen zu lassen, müsste ich die beiden Umgebungsvariablen setzen und dann einfach den Server starten über die Kommandozeile und als jar in meiner Appliakation den DerbyClient nutzen. 

Um es dann auf dem Server laufen zu lassen, dass gleiche auf dem Server, nur dass die Hostaddresse dann eben angepasst werden muss.

Was bringt mit der WindowsDienst und könnte ich den Netzwerk Server auch mit Java starten?
GRuß


----------



## vogella (4. Nov 2009)

Die Derby DB muß ja als separater Prozeß laufen, d.h. Du kannst den Server NICHT von Deinem Programm aus starten. Der Windows Service kann genutzt werden, um Derby automatisch zu starten, d.h. wenn der Rechner hochfährt startet die DB. Ansonsten muß Du Dich auf dem Server anmelden, eine Shell starten und das Ding immer händisch starten.


----------



## Stinner (10. Nov 2009)

Hi,
da ich die Variant mit dem Server hier nicht nutzen kann, versuche ich das ganze jetzt auch selbst zu implementieren.
Habe gesehen, dass man Derby auch im EmbeddedMode in Read-Only öffnen kann, allerdings sperrt das DBMS trotzdem die Datenbank über die db.lck

Versuche jetzt gerade diese File zu löschen, allerdings geht das nicht, da die File von Derby genutzt wird. Sons wäre mein Ansatz, dass ich immer im Read-Only öffne und dann die db.lck file lösche. Will jmd in den Write modus, verwalte ich selbst eine Locking-File.
Allerdings bekomm ich die File nicht gelöscht. Hast du dafür eine Idee bzw. das auch schon versucht?
GRuß


----------



## vogella (10. Nov 2009)

Nein, habe ich nicht.


----------

