Kleines Beispiel zur Verwendung der Derby DB in Java 6

Hallo,

ich stehe vor dem Problem (auch schon das ganze Netz abgesucht), dass ich meine (embedded) Datenbank gerne in dem *.jar file ausliefern möchte.

Leider gibt es dabei aber noch ein Problem:
Der Absolute Pfad in der getConnection(..) verhindert dies! Mit dem relativen Pfad klappts aber auch noch nicht so recht. Die erzeugte DB soll unter $TARGET\db liegen

Fall1: absoluter pfad ==> ok
verbindung = DriverManager.getConnection("jdbc:derby:I:/workspace/test/App/db/app2008");

Fall2 : relativ zum $TARGET\bin- ordner ==> FEHLER
verbindung = DriverManager.getConnection("jdbc:derby:../../db/app2008");

Wie muss der realitve pfad dür heissen?
Was muss ich bzgl. DERBY_INSTALL und der CLASSPATH-Var. beachten um die DB dann in dem *jar File nach aussen hin weitergeben zu können?

Danke schon mal für Eure Hilfe
 
Hallo,

bei mir funktioniert folgendes Szenario:
1) Obiges Beispiel laufen lassen (damit die Datenbank erstellt wird)
2) Datenbank URL umstellen auf: "jdbc:derby:./tutorialsDB"
3) DerbyEmbeddedDatabaseExample als ausführbares Jar exportieren (derby.jar etc. in zusätzlichem Verzeichnis mitliefern) -> Export as runnable jar / copy required libraries into sub-folder.
4) In Schritt 1 erstellte Datenbank (Verzeichnis) in das Zielverzeichnis des unter 3) erstellten jars kopieren.

Schon sollte es Funktionieren.

Wenn du die db wirklich im Jar File ablegen willst könntest du mal versuchen diese über eine spezielle jar-File URL anzusprechen:
jar:file:/test.jar!tutorialsDB
Kann sein, dass du dann die DB im Read-Only Modus starten musst um Fehler zu vermeiden.

Gruß Tom
 
Hallo Thomas,

vielen Dank für deine Antwort. Beruhigend zu wissen, dass es schon geht. ;-)

Ich werde es demnächst mal auf diesem Wege versuchen.

Happy coding!
 
Da fällt mir noch was ein:

In der eigentlichen App. könnte der User ja den Pfad zur DB konfigurierbar festlegen und genau dort wartet dann zb. das selbstkopierte Datenbankverz. samt aller Files auf den Zugriff. Das sollte das Problem der Weitergabe erstmal einfach lösen.

Letztendlich muss es aber auch möglich sein, die DB vor den Blicken des Users verstecken zu können. Kennt vielleicht jemand diesbzgl. Tutorials im Netz?
 
@Thomas

Jetzt bin ich etwas schlauer.
Also die Weitergabe per DB-Directory funktioniert nun super (Danke auch für die Eclipse-Tipps).

Allerdings scheint es bei der aktuellen Derby Version zu einer Abweichung in der Betrachtung des Application-Root-Directory's zu kommen?
Denn im Gegensatz zur Doku, die beschreibt, das "../meineDB" den Pfad zur $APP\meineDB sein sollte, ist es nun einfach: meineDB (siehe unten)

statt : "jdbc:derby:./meineDB" ==> "jdbc:derby:meineDB";
Derby Version 10.5

@all
liesse sich das von jemanden bestätigen ;-)?
 
Hallo zusammen,

ich habe ein bisschen gegoogelt und diesen Beitrag gefunden. Ich verwende zur Zeit Derby als Embedded DB in einer kleinen Java Applikation.

Vorab noch eine Info - benutze für dieses Projekt Netbeans 6.9, jdk1.6.0_21, Windows 7 Pro 64 Bit

So, alles funktioniert im Debug mode prima, ich kann Tabellen anlegen, Daten aus den Tabellen lesen usw.

Wenn ich aber meine Applikation mit einem Installer einpacke und es wie ein normales Programm in Program Files installiere, bekomme ich immer beim Start des Programms (wann die Verbindung zur DB stattfinden muss) eine Exception:

Failed to create database 'C:\Program Files\MeineApp\meineDB', see the next exception for details.

So, nach einem langen Debug habe ich folgendes festgestellt: solange ich meine Anwendung *nicht* in Program Files installiere, funktioniert alles einwandfrei. Deswegen ahne ich, es geht hier nur um Schreibrechte der Anwendung in dem Program Files Ordner.

Angenommen ich habe Recht, wie kann ich das einstellen, dass Derby, bzw. meine Anwendung Schreibrechte auf solche Ordner hat?

Vielen Dank!
 
kann ich auch mit dieser ij.bat ne datenbank erstellen, die auch einen user und ein password hat? Wenn ja, wie mache ich das in der ij.bat?
 
Hi all,

Hm,- ich finde meine DB nicht :-)

Hab das Bsp. von oben verwendet.

Wurden nun die Daten in C:\TEMP\tutorialsDB\seg0 abgelegt (könnter gemäß Datum sein) oder baut Derby noch weitere Dateien auf ?

Grüße
xrax
 
Hallo,

wenn du das ursprüngliche Beispiel verwendet hast sollten die Daten am genannten Ort abgespeichert werden - habe das gerade wieder überprüft (mit JDK 1.7.0u40)

Gruß Tom
 
@thomas & Vater

Ihr habt zwei Alternative Wege aufgezeigt die Verbindung zur DB herzustellen - wo ist denn jetzt dabei der Unterschied?

Also Vergleich mit Treiber embeddedDriver vs. Datenquelle mit EmbeddedDataSource-Objekt

Grüße

Jay Jay
 
Zurück