# Zugriff auf Derby-Datenbank will einfach nicht klappen



## Toast78 (25. Nov 2008)

Guden Tach!

Ich versuche schon seit einiger Zeit den Zugriff auf eine Derby-DB2 hinzubekommen, aber irgendwie will es nicht klappen. Die Entscheidung fiel auf Derby, da sie bereits in Java/NetBeans integriert ist und die Kollegen von mir einen  Mac bzw. ubuntu benutzen. 

Ich selbst habe Windows XP mit JDK 1.5_06 mit NetBeans 6.1 in Benutzung.

Bisher wollte ich es eigentlich mittels

```
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
con = DriverManager.getConnection("jdbc:derby:"
        + "E:/FH-GE/08-09_WS/PPR/NewOrderDB");
```
versuchen, aber schon beim Class.forName steigt mir das Programm mit der Meldung "Failed to start database 'E:/FH-GE/08-09_WS/PPR/NewOrderDB', see the next exception for details." aus. 

Ich habe bereits auch versucht, laut diesem Tipp die derby.jar in mein Projekt zu integrieren. Die derby.jar wurde sowohl in das entsprechende Package kopiert, als auch in das lib-Verzeichnis des JDKs kopiert. Dann wurde auch unter den Project-Properties die derby.jar aus dem lib-Verzeichnis eingebunden, was aber auch nicht half.
Wenn ich bei der import-Anweisung "org." eingebe, dann wird mir auch schon von apache das derby-Paket angezeigt, aber kompilieren kann ich das dann immer noch nicht, da ich die Meldung erhalte: "package org.apache.derby doesn't exist"


----------



## mg_666 (26. Nov 2008)

hast es mal so versucht?

Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
con = DriverManager.getConnection("jdbc:derbyBName;create=true"); 

Von NetBeans habe ich leider keine Ahnung.


----------



## Toast78 (26. Nov 2008)

Das mit dem Class.forName funktioniert jetzt soweit, nur den DriverManager anzusprechen funktioniert nicht. Für den DB_Path habe ich auch nochmal die Slashes / durch Backslashes \\ ersetzt, aber das wollte auch nicht funktionieren.
Man sagte mir, dass man die Datenbank stoppen sollte, damit die Lock-Datei (LCK-Endung) gelöscht werden kann. Dazu habe ich dann in den Services auch die Datenbank getrennt. Trotzdem lautet beim getConnection die Fehlermeldung nach wie vor die gleiche.


----------



## mg_666 (26. Nov 2008)

Kannst Du mit eine Client wie squirrel auf die DB zugreifen oder geht da auch nichts?


----------



## Guest (26. Nov 2008)

Die Class.forName-Anweisung funktioniert ja. Den Treiber kann ich also schonmal ansprechen.
Zugriff auf die Datenbank mittels NetBeans funktioniert ja auch, ansonsten hätte ich die Datenbank schlecht erstellen können.


----------



## Toast78 (26. Nov 2008)

Hmm nach der Aktualisierung meines Browsers war ich wohl nicht ganz eingeloggt.


----------



## Guest (26. Nov 2008)

naja, wenn du mit einem Client auf der Datenbank bist und Du gleichzeitig mit Java drüber ruckeln willst, dann geht dieses nicht, wegen dem gleichen bzw. in meinem Fall gar nicht vorhandenen Nutzer.... sind meine Erfahrungen.


----------



## mg_666 (26. Nov 2008)

dito


----------



## HoaX (27. Nov 2008)

Anonymous hat gesagt.:
			
		

> naja, wenn du mit einem Client auf der Datenbank bist und Du gleichzeitig mit Java drüber ruckeln willst, dann geht dieses nicht, wegen dem gleichen bzw. in meinem Fall gar nicht vorhandenen Nutzer.... sind meine Erfahrungen.



willst du damit sagen man kann pro benutzer nur eine verbindung aufbauen? das geht definitiv, wäre ja unsinn wenn nicht.


----------



## mg_666 (27. Nov 2008)

was geht definitiv das ich mehrere Verbindungen aufbaue wenn ich keinen Nutzer angelegt habe und mich trotzdem verbinde?


----------



## HoaX (27. Nov 2008)

Bitte formuliere deine Frage mal um, ich verstehe die nicht wirklich ...


----------



## mg_666 (27. Nov 2008)

Ich wollte nur wissen was Du mit Deiner Aussage gemeint hast.

So wie ich es verstanden habe baust Du eine Verbindung mit Squirrel und gleichzeitig startest Du Dein Javaprogramm wo auch eine Verbindung zur Datenbank aufgebaut wird. Diese beiden unterschiedlichen Anwendungen loggen sich mit "keinem" Nutzer an und der Verbindungsaufbau funktioniert trotzdem.


----------



## Felli (29. Nov 2008)

Dass man sich zwei oder mehrere Male auf eine eingebettete Derby-Datenbank anmelden kann, funktioniert meines Wissens nicht. Gelingt der Zugriff nicht, so besteht vermutlich schon eine andere Verbindung. 

Möchte man mehrere Verbindungen haben, so sollte man die Client-Server-Variante wählen. Dazu ist der Server zu starten (startNetworkServer.ksh), die Datei derbyclient.jar in den Klassenpfad aufzunehmen und der ClientDriver zu wählen.


----------



## cjarlie (4. Dez 2008)

y, will kein neues Thema eröffnen da ich ei
n ähnliches Problem habe. Jedoch wird bei mir der Driver _org.apache.derby.jdbc.EmbeddedDriver_
nicht gefunden.

Die Exception sieht wiefolgt aus:


```
Exception in thread "main" java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:169)
        at sebase.Database.<init>(Database.java:20)
        at sebase.SebaseApp.main(SebaseApp.java:43)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
```

Dazu Folgender Code:



```
Connection con;
    String path = "jdbc:derby://localhost:1527/sebase";
    String username = "sebase";
    String password = "password";

    Database() throws Exception {
            String driver = "org.apache.derby.jdbc.EmbeddedDriver";
            Class.forName(driver).newInstance();
            con = DriverManager.getConnection(path, username, password);
    }
```

benutze Vista, JDK 6, Apache Derby 10.3.* und NetBeans 6.5


----------



## Felli (6. Dez 2008)

Tja, das Problem ließe sich bestimmt einfach lösen, wenn derby.jar im Klassenpfad aufgenommen wird. Des Weiteren ist die Pfadangabe wie bei einem Client-Server-Zugriff. Ich würde eher so etwas probieren:


```
String path = "jdbc:derby:/tmp/meinedb;create=true";
```
Wenn du allerdings wirklich Zugriff auf eine Derby-Datenbank im Client-Server-Modus haben möchtest, so verwende ClientDriver statt EmbeddedDriver.


----------



## mephi (10. Dez 2008)

Felli hat gesagt.:
			
		

> Dass man sich zwei oder mehrere Male auf eine eingebettete Derby-Datenbank anmelden kann, funktioniert meines Wissens nicht. Gelingt der Zugriff nicht, so besteht vermutlich schon eine andere Verbindung.
> 
> Möchte man mehrere Verbindungen haben, so sollte man die Client-Server-Variante wählen. Dazu ist der Server zu starten (startNetworkServer.ksh), die Datei derbyclient.jar in den Klassenpfad aufzunehmen und der ClientDriver zu wählen.




hatte eben ein ähnliches problem und hab mich deswegen mal umgeschaut..

aus dem derby admin guide:



> *Multi-connection and multi-threading:*
> Derby allows multiple simultaneous connections to a database, even in embedded mode.
> Derby is also fully multi-threaded, and you can have multiple threads active at the same
> time. However, JDBC semantics impose some limitations on multi-threading. See the
> Derby Developer's Guide for more information.



Ich hab es aber auch dass ich nicht auf die DB connecten kann, wenn ich eine Connection mit dem Eclipse Data Source Explorer offen habe.


----------



## HoaX (10. Dez 2008)

wenn du mehrere connections auf eine embedded datenbank willst dürfen diese nur innerhalb der selben vm/prozess kommen. d.h. du kannst mir dem eclipse data source explorer x verbindungen öffnen. willst du mit einem zweiten programm zugreifen musst du den servermode nehmen


----------



## mephi (11. Dez 2008)

ok, d.h. also wenn ich über ein servlet in eine DB schreib, dann reicht die embedded? auch wenn das servlet mehrmals zur selben zeit aufgerufen wird?


----------



## HoaX (11. Dez 2008)

genau.

trotzdem würde ich auch fürs servlet den servermode bevorzugen, denn dann kann man auch korrekturen/...  mit externen tools machen ohne die seite lahmlegen zu müssen


----------



## mephi (11. Dez 2008)

ja da hast schon recht. habs nur noch nicht hinbekommen dass ich mein server aus der applikation heraus starten und ansprechen kann. dann kann ich nämlich zu demo zwecken einfach eine war rausgeben ohne die ganzen einstellungen machen zu müssen


----------



## HoaX (11. Dez 2008)

beste lösung:
lass doch den "benutzer" im servletcontainer nen datasource definieren auf den du dann im servlet zugreifst. dann kann es dir egal sein ob embedded oder nicht.

schlechte lösung: (will ich dir wirklich nicht empfehlen)
ich habe auch schon eine anwendung geschrieben die eine derby-db mitstartet:  

```
nsc = new org.apache.derby.drda.NetworkServerControl(InetAddress.getByName(address), port);
nsc.start(new PrintWriter(System.out, true));
```


----------



## mephi (11. Dez 2008)

hmm. was ist denn daran so schlecht? das könnte ich doch in die init methode meines servlets schreiben.

was muss ich denn für die variable "address" nehmen? was ich will?


p.s. aktuell bin ich ja schon froh wenn es irgendwie funktioniert


----------



## HoaX (11. Dez 2008)

weil es nicht aufgabe des servlets sein sollte. nicht jeder will die datenbank mit starten, evtl will nichtmal jeder derby verwenden, vielleicht will jemand eine bestehende datenbank auf einem anderen server verwenden? was ist wenn auf einem rechner zwei mal das servlet laufen soll, test- und livesystem? 

per datasource bist du unabhängig. geht soweit dass du sogar derby durch mysql ersetzten könntest ohne am servlet was machen zu müssen (vorausgesetzt es werden keine speziellen sql-befehle im servlet verwendet)

address ist die lokale adresse auf der es lauschen soll


----------

