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

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

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

<< этот дает мне «Отказано в доступе» </p>

EPIC currdir = /usr/local/cpanel/base

<< этот дает мне «Отказано в доступе» </p>

EPICEST!  =  

<< это нормально .. но подождите .. НЕТ EPICER ??? </p>

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

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

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

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

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

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

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

"это" возвращалось к нулю, потому что что? СЮРПРИЗ, нет ServletContext итак

getServletContext() 

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

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

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

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

Спасибо всем

Ответы [ 2 ]

1 голос
/ 15 марта 2012

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

0 голосов
/ 07 марта 2013

Для доступа к базе данных из апплета с использованием 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 /

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

...