У меня проблемы с доступом к моей базе данных на сервере. Я использую фрагмент кода, чтобы попытаться подключиться.
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);
и это работает!!
Всем спасибо