Невозможно получить доступ к базе данных Embedded Derby только для чтения из файла EAR, развернутого на сервере JBoss - PullRequest
2 голосов
/ 29 сентября 2010

Я пытаюсь получить доступ к базе данных Embedded Derby только для чтения. Он доступен как myDB.jar. В этом банке есть одна папка базы данных Apache Derby - myDB (папки log и seg0 и файл service.properties). Этот код отлично работает, когда я запускаю из файла метод main. Но когда я упаковываю его в EAR и разворачиваю на сервере, это дает ошибку.

Эта база данных упакована с файлом EAR и развернута на сервере JBoss 5.0.1.

EAR имеет следующее содержание: • myWebApp.war • myEjbs.jar • myDB.jar • META-INF / MANIFEST.MF и META-INF / application.xml

Содержание MANIFEST.MF: Манифест-Версия: 1.0 Путь к классу: myDB.jar

myDB.jar не зарегистрирован в application.xml

EJB-JAR, т.е. myEjbs.jar, имеет следующее содержимое: • derby.properties • META-INF / MANIFEST.MF и другие, такие как persistence.xml и т. Д. Содержание MANIFEST.MF: Манифест-Версия: 1.0 Путь к классу: myDB.jar • com.xxx.common.DbUtility.class, который имеет следующий код для доступа к базе данных:

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

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

Выходные данные этого класса затем используются EJB в пакете com.xxx.ejbs.

Вот ошибка, которую я получаю:

ИНФОРМАЦИЯ Загруженный драйвер базы данных: org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: Не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss-service.xml} см. следующее исключение для деталей.

ИНФОРМАЦИЯ java.sql.SQLException: не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss- service.xml}, подробности смотрите в следующем исключении.

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException (неизвестный источник)

ИНФОРМАЦИЯ [STDOUT] (http-127.0.0.1-8080-1) по адресу org.apache.derby.impl.jdbc.Util.newEmbedSQLException (неизвестный источник)

ИНФОРМАЦИЯ на java.sql.DriverManager.getConnection (DriverManager.java:582)

ИНФОРМАЦИЯ на java.sql.DriverManager.getConnection (DriverManager.java:185)

ИНФОРМАЦИЯ Причина: java.sql.SQLException: Не удалось запустить базу данных 'jar: (myDB.jar) myDB' с загрузчиком классов BaseClassLoader @ 127627 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf /jboss-service.xml}, подробности смотрите в следующем исключении.

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException (Неизвестный источник)

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA (Неизвестный источник)

ИНФОРМАЦИЯ Причина: java.sql.SQLException: исключение Java: «myDB.jar (система не может найти указанный файл): java.io.FileNotFoundException».

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException (Неизвестный источник)

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException (неизвестный источник)

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.Util.newEmbedSQLException (неизвестный источник)

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.Util.javaException (неизвестный источник)

ИНФОРМАЦИЯ Причина: java.io.FileNotFoundException: myDB.jar (система не может найти указанный файл)

ИНФОРМАЦИЯ на java.util.zip.ZipFile.open (собственный метод)

ИНФОРМАЦИЯ на java.util.zip.ZipFile. (ZipFile.java:114)

ИНФОРМАЦИЯ на java.util.zip.ZipFile. (ZipFile.java:131)

ИНФОРМАЦИЯ на org.apache.derby.impl.io.JarStorageFactory.doInit (неизвестный источник)

ИНФОРМАЦИЯ на org.apache.derby.impl.io.BaseStorageFactory.init (неизвестный источник)


Спасибо за ваш ответ. Я сейчас попробовал следующее:

(Я)

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 = "";</p>

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

Это все еще дает ту же ошибку. Ниже приведен журнал сервера.

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

ИНФОРМАЦИЯ Загружен dДрайвер atabase: org.apache.derby.jdbc.EmbeddedDriver

INFO SQLException: Не удалось запустить базу данных 'jar: (/ C: /jboss-5.0.1.GA/server/default/deploy/Main.ear/myDB.jar/) myDB' с загрузчиком классов BaseClassLoader @ e6c6d7 {vfsfile: / C: /jboss-5.0.1.GA/server/default/conf/jboss-service.xml}, подробности смотрите в следующем исключении.

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException (неизвестный источник)

ИНФОРМАЦИЯ Причина: java.sql.SQLException: исключение Java: 'C: \ jboss-5.0.1.GA \ server \ default \ deploy \ Main.ear \ myDB.jar (системе не удается найти указанный путь): java. io.FileNotFoundException.

ИНФОРМАЦИЯ на org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException (Неизвестный источник)

ИНФОРМАЦИЯ Причина: java.io.FileNotFoundException: C: \ jboss-5.0.1.GA \ server \ default \ deploy \ Main.ear \ myDB.jar (системе не удается найти указанный путь)

ИНФОРМАЦИЯ на java.util.zip.ZipFile.open (собственный метод)

ИНФОРМАЦИЯ на java.util.zip.ZipFile. (ZipFile.java:114)

ИНФОРМАЦИЯ на java.util.zip.ZipFile. (ZipFile.java:131)

ИНФОРМАЦИЯ на org.apache.derby.impl.io.JarStorageFactory.doInit (неизвестный источник)


Ниже приведен вывод, когда классы изначально загружаются JBoss:

BaseClassLoader @ a75818 {vfszip: / C: /jboss-5.0.1.GA/server/default/deploy/Main.ear/} с политикой 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 [путь = 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,…

Похоже, что myDB.jar находится в пути к классам, и папка базы данных myDB также загружена.

(II),

Тогда я попробовал следующее:

private static String dbURL_nfdc = "jdbc:derby:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>

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

Я снова получаю сообщение об ошибке, но теперь я не получаю FileNotFoundException:

ИНФОРМАЦИЯ java.sql.SQLException: База данных '/ myDB' не найдена.

ИНФОРМАЦИЯ Причина: java.sql.SQLException: База данных '/ myDB' не найдена.

Похоже, вы указали мне правильное направление, но я не могу найти причину этой ошибки.

(III),

Я также попробовал следующее:

private static String dbURL_nfdc = "jdbc:derby:"; (No / )
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>

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

Но получите то же исключение SQLE.

Возможно ли, что JBoss рассматривает myDB как пакет java, а не как простую файловую папку?

Сработало следующее:

private static String dbURL_nfdc = "jdbc:derby:classpath:/";
private static String dbName = "myDB";
private static String user = "";
private static String password = "";</p>

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

Большое спасибо за то, что привели меня в правильном направлении. Ценю твою помощь!!!

1 Ответ

0 голосов
/ 30 сентября 2010

Поскольку ваш jar базы данных находится в том же самом пакете EJB ear, я думаю, что он должен быть "в classpath", поэтому вы должны попробовать следовать разделу "inpath classpath" в документации по http://db.apache.org/derby/docs/10.6/devguide/cdevdvlp24155.html#cdevdvlp24155.

То есть я не думаю, что вы хотите использовать подпротокол "jar".

В качестве альтернативы, если вы собираетесь использовать подпротокол "jar", то я думаю, чточасть внутри скобок должна быть полным путем к вашей файловой системе ejb ear.

...