2 Stimmen

Zugriff auf eine schreibgeschützte eingebettete Derby-Datenbank aus einer auf dem JBoss-Server bereitgestellten EAR-Datei ist nicht möglich

Ich versuche, auf eine schreibgeschützte Embedded Derby-Datenbank zuzugreifen. Sie ist als myDB.jar verfügbar. Dieses Jar enthält einen Ordner der Apache Derby-Datenbank - myDB (Ordner log und seg0 sowie die Datei service.properties). Dieser Code funktioniert gut, wenn ich ihn aus einer Datei mit einer main-Methode ausführe. Wenn ich ihn jedoch in ein EAR-Paket packe und auf dem Server einsetze, tritt ein Fehler auf.

Diese Datenbank wird mit einer EAR-Datei verpackt und auf einem JBoss 5.0.1-Server bereitgestellt.

Die EAR hat folgenden Inhalt: - myWebApp.war - myEjbs.jar - myDB.jar - META-INF/MANIFEST.MF und META-INF/application.xml

Inhalt von MANIFEST.MF: Manifest-Version: 1.0 Klassen-Pfad: myDB.jar

myDB.jar ist nicht in application.xml registriert

EJB-JAR, d.h. myEjbs.jar, hat den folgenden Inhalt: - derby.properties - META-INF/MANIFEST.MF und andere wie persistence.xml, usw. Inhalt von MANIFEST.MF: Manifest-Version: 1.0 Klassen-Pfad: myDB.jar - com.xxx.common.DbUtility.class, die den folgenden Code für den Zugriff auf die Datenbank enthält:

private static String dbURL = "jdbc:derby:jar:(myDB.jar)";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";

Connection con  = DriverManager.getConnection(dbURL+ dbName, user, password);

Die Ausgabe dieser Klasse wird dann von den EJBs im Paket com.xxx.ejbs verwendet.

Ich erhalte die folgende Fehlermeldung:

INFO Geladener Datenbanktreiber: org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.

INFO java.sql.SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)

INFO [STDOUT] (http-127.0.0.1-8080-1) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unbekannte Quelle)

INFO at java.sql.DriverManager.getConnection(DriverManager.java:582)

INFO at java.sql.DriverManager.getConnection(DriverManager.java:185)

INFO Verursacht durch: java.sql.SQLException: Fehler beim Starten der Datenbank 'jar:(myDB.jar)myDB' mit dem Klassenlader BaseClassLoader@127627{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)

INFO Verursacht durch: java.sql.SQLException: Java-Ausnahme: 'myDB.jar (Das System kann die angegebene Datei nicht finden): java.io.FileNotFoundException'.

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)

INFO at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)

INFO at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)

INFO Verursacht durch: java.io.FileNotFoundException: myDB.jar (Das System kann die angegebene Datei nicht finden)

INFO at java.util.zip.ZipFile.open(Native Methode)

INFO at java.util.zip.ZipFile.<init>(ZipFile.java:114)

INFO at java.util.zip.ZipFile.<init>(ZipFile.java:131)

INFO at org.apache.derby.impl.io.JarStorageFactory.doInit(Unbekannte Quelle)

INFO at org.apache.derby.impl.io.BaseStorageFactory.init(Unbekannte Quelle)

Ich danke Ihnen für Ihre Antwort. Ich habe nun Folgendes versucht:

(I)

String path = getClass().getClassLoader().getResource("myDB.jar").getPath();
System.out.println("Path found = " + path);
private static String dbURL = "jdbc:derby:jar:" + "(" + path + ")";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

Es wird immer noch derselbe Fehler angezeigt. Nachfolgend finden Sie das Serverprotokoll.

INFO Pfad gefunden = /C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/

INFO Geladener Datenbanktreiber: org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: Fehler beim Starten der Datenbank 'jar:(/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/)myDB' mit dem Klassenlader BaseClassLoader@e6c6d7{vfsfile:/C:/jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, siehe die nächste Ausnahme für Details.

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unbekannte Quelle)

INFO Verursacht durch: java.sql.SQLException: Java-Ausnahme: ' C:\jboss -5.0.1.GA \server\default\deploy\Main.ear\ myDB.jar (Das System kann den angegebenen Pfad nicht finden): java.io.FileNotFoundException'.

INFO at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unbekannte Quelle)

INFO Verursacht durch: java.io.FileNotFoundException: C:\jboss -5.0.1.GA \server\default\deploy\Main.ear\ myDB.jar (Das System kann den angegebenen Pfad nicht finden)

INFO at java.util.zip.ZipFile.open(Native Methode)

INFO at java.util.zip.ZipFile.(ZipFile.java:114)

INFO at java.util.zip.ZipFile.(ZipFile.java:131)

INFO at org.apache.derby.impl.io.JarStorageFactory.doInit(Unbekannte Quelle)

Die folgende Ausgabe wird angezeigt, wenn die Klassen von JBoss anfänglich geladen werden:

BaseClassLoader@a75818{vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/} mit Richtlinie VFSClassLoaderPolicy@88a588{name=vfszip:/C:/jboss-5.0.1.GA/server/default/deploy/Main. ear/ domain=null roots=[MemoryContextHandler@19639558[path= context=vfsmemory://ak42v-bfhwq-ger46v84-1-ger477uj-20 real=vfsmemory://ak42v-bfhwq-ger46v84-1-ger477uj-20], DelegatingHandler@7111491[path=Main. ear context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5. 0.1.GA/server/default/deploy/Main.ear], DelegatingHandler@1948811[path=Main.ear/myEJBs.jar context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5.0.1.GA/server/default/deploy/Main.ear/myEJBs. jar], DelegatingHandler@4545587[path=Main.ear/ myDB.jar context=file:/C:/jboss-5.0.1.GA/server/default/deploy/ real=file:/C:/jboss-5. 0.1.GA/server/default/deploy/Main.ear/ myDB.jar], com.xxx.common, com.xxx.ejb, myDB, myDB.seg0, META-INF, myDB.log,

Es sieht also so aus, als ob myDB.jar im Klassenpfad liegt und der Datenbankordner myDB ebenfalls geladen ist.

(II)

Dann habe ich Folgendes versucht:

private static String dbURL\_nfdc = "jdbc:derby:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

Ich erhalte wieder eine Fehlermeldung, aber jetzt bekomme ich keine FileNotFoundException:

INFO java.sql.SQLException: Datenbank '/myDB' nicht gefunden.

INFO Verursacht durch: java.sql.SQLException: Datenbank '/myDB' nicht gefunden.

Sieht so aus, als hätten Sie mich auf den richtigen Weg gebracht, aber ich kann den Grund für diesen Fehler nicht finden.

(III)

Ich habe auch Folgendes versucht:

private static String dbURL\_nfdc = "jdbc:derby:"; (No / )
private static String dbName = "myDB";
private static String user = "";
private static String password = "";

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

Aber ich erhalte die gleiche SQLException.

Ist es möglich, dass JBoss myDB als ein Java-Paket und nicht als einen einfachen Dateiordner behandelt?

Das Folgende hat funktioniert:

private static String dbURL\_nfdc = "jdbc:derby:classpath:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";

Connection con = DriverManager.getConnection(dbURL+dbName, user, password);

Vielen Dank, dass Sie mich auf den richtigen Weg gebracht haben. Ich weiß Ihre Hilfe zu schätzen!!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X