Возникли проблемы с поиском (подключением) базы данных с использованием относительного пути

У меня проблемы с доступом к моей базе данных на сервере. Я использую фрагмент кода, чтобы попытаться подключиться.

String currentDir = new File(".").getAbsolutePath();
String currdir = System.getProperty("user.dir");
System.out.println("EPIC currentDir = " + currentDir);
System.out.println("EPIC currdir = " + currdir);
String builder = "jdbc:sqlite:"+ currentDir +"dbname";

Теперь .. printlns говорят мне, что:

currentDir = /usr/local/cpanel/base/.
currdir = /usr/local/cpanel/base

и я знаю, что это даст SQLException, потому что моя БД находится в ../WEB-INF/lib/dbname Поэтому неудивительно, что я получаю это сообщение об ошибке:

java.sql.SQLException: opening db: '/usr/local/cpanel/base/.dbname': Permission denied

Итак, мой вопрос: что находится после базы и как это связано с моим каталогом (откуда запускается сервлет)? У меня нет SSH, чтобы искать его (закатывает глаза), и если кто-нибудь может пролить свет на эту тему, я был бы признателен! Заранее спасибо!

Изменить: Странные вещи

Я тестирую все это с помощью этих команд.

String currentDir = new File("dbname").getAbsolutePath();
String currdir = System.getProperty("user.dir");
System.out.println("EPIC currentDir = " + currentDir);
System.out.println("EPIC currdir = " + currdir);
System.out.println("EPICER  = " + this.getClass().getResource("dbname").toString());
System.out.println("EPICEST!  = ");

это вывод:

EPIC currentDir = /usr/local/cpanel/base/dbname

‹‹ это дает мне «Отказано в доступе»

EPIC currdir = /usr/local/cpanel/base

‹‹ это дает мне «Отказано в доступе»

EPICEST!  =  

‹‹ это нормально.. но подождите.. NO EPICER???

System.out.println("EPICER  = " + this.getClass().getResource("dbname").toString());

НЕ ПЕЧАТАЕТ!! какие? фильтруется ли мой журнал, чтобы я не мог просмотреть путь? Кроме того, ни один из этих путей не работает :(

‹‹‹‹---ОБНОВЛЕНИЕ--->>>>

Не печатал, потому что «это» возвращало ноль, и я фактически получал NPE в этой строке; таким образом, нет println. дух.

ПОСЛЕДНЯЯ РЕДАКТИРОВАНИЕ: РЕШЕНО!

Итак, я все делал неправильно, и я публикую это на случай, если какой-нибудь другой бедняга собирается потратить три дня впустую, как я..

this.getClass().getResource("dbname").toString()) 

«это» возвращалось нулевым, потому что что? СЮРПРИЗ, нет ServletContext, поэтому

getServletContext() 

также возвращал null (что-то, с чем я экспериментировал позже)

Из других ресурсов в Интернете я узнал, что то, как я собирался это сделать, было неверным, потому что каждый раз, когда я повторно развертываю файл WAR, БД будет перезаписываться ... поэтому я создал небольшой каталог в своем /home/ username/ вызвал dbfiles и использовал команды:

String dir= "jdbc:sqlite:/home/username/dbfiles/dbname.db";
connection = DriverManager.getConnection(dir);

и это работает!!

Всем спасибо


person tricknology    schedule 15.03.2012    source источник
comment
Ошибка говорит, что в доступе отказано, поэтому я не думаю, что есть проблема с путем.   -  person Shashank Kadne    schedule 15.03.2012
comment
возможный дубликат Как загрузить ресурс из Каталог WEB-INF веб-архива   -  person Snicolas    schedule 15.03.2012
comment
ааа, так он находит базу данных, но не имеет прав на чтение/запись?   -  person tricknology    schedule 15.03.2012
comment
Святая корова, спасибо, Сниколас! Я искал несколько дней для того ответа!!!   -  person tricknology    schedule 15.03.2012
comment
Что ж, после некоторого тестирования.. происходят странные вещи.. обновлено в редактировании.   -  person tricknology    schedule 15.03.2012


Ответы (2)


user.dir — это каталог системного пользователя. Если вы хотите найти файл внутри войны приложений, используйте ServletContext.getRealPath()

person Bartek Jablonski    schedule 15.03.2012
comment
ServletContext возвращал значение null, потому что я нуб ... также я использую tomcat7, а web.xml (насколько я вижу своими нубскими глазами) не нужен. Однако я нашел случаи, когда люди помещали web.xml в свой /WEB-INF/. Почему это так? и что он делает? Если у вас есть какие-либо ресурсы, которые разъясняют это для n00bs, таких как я, пожалуйста, поделитесь. Кроме того, я исправил проблему, и она находится в последнем редактировании. - person tricknology; 15.03.2012

Чтобы получить доступ к базе данных из апплета с помощью JDBC (только для чтения):

Я сделал соединение, подобное указанному здесь http://www.shoaibinamdar.in/blog/?p=313, но внутри

    ds.setUrl("jdbc:sqlite::resource:"+
    getClass().getResource("sample.db").toString());

я кладу

    ds.setUrl("jdbc:sqlite:resource/sample.db");

sample.db попал в /myprojectname/resource/sample.db, при этом ресурс находится в том же каталоге (myprojectname), что и /myprojectname/src/

Надеюсь, это поможет кому-то

person tricknology    schedule 07.03.2013