Относительный путь к БД SQLite в context.xml - PullRequest
4 голосов
/ 21 апреля 2009

Можно ли использовать относительный путь к файлу базы данных SQLite в файле context.xml веб-приложения Java?

В настоящее время у меня есть:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/mywebapp">
    <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="myusername" password="mypassword" driverClassName="org.sqlite.JDBC"
        url="jdbc:sqlite://Users/me/NetBeansProjects/MyApp/web/my.db"/>
</Context>

Как видите, атрибут url тега Resource в настоящее время указывает абсолютный путь к my.db. Тем не менее, я работаю над этим проектом с небольшой командой разработчиков как проект класса. Мы передаем код через Subversion, и в настоящее время каждый раз, когда один из нас обновляет наш проект, мы должны вручную заменить вышеуказанный путь на правильный путь для нашего компьютера.

Заранее спасибо.

<ч />

ОБНОВЛЕНИЕ: Похоже, что относительные пути относятся не к файлу context.xml, а к CATALINA_HOME. К сожалению, этот каталог (где находится Tomcat) находится в домашней папке другого пользователя (1), к которой у меня есть доступ только для чтения:

(1) / home / myprof / Tomcat / bin /
(2) /home/me/NetBeansProjects/MyApp/web/my.db

Я не могу включить / me в относительный путь, потому что, как указано выше, этот проект будет выполняться на нескольких компьютерах через репозиторий svn, и каталог, в котором содержатся файлы проекта (2), изменится. Однако, поскольку все учетные записи находятся в общей виртуальной сети, CATALINA_HOME (1) не изменится.

<ч />

Кроме того, как я могу получить путь к файлу базы данных my.db из файла context.xml выше внутри сервлета?

Ответы [ 6 ]

9 голосов
/ 24 апреля 2009

Я нашел следующие примеры использования JDBC с SQLite:

  • Для доступа к памяти:

     jdbc:sqlite::memory:
    
  • Для относительных путей:

     jdbc:sqlite:relative/path.db
    
  • Для абсолютных путей:

     jdbc:sqlite:/absolute/path.db
    
1 голос
/ 30 апреля 2009

Как другой подход: вы пытались использовать jdbc:sqlite:~/myapp.db? Это должно быть записываемым местоположением на компьютерах всех, кто запускает это приложение. (Хотя я видел зло в домашних каталогах только для чтения.)

Я не совсем уверен, поддерживает ли SQLite ~ в URL базы данных. Я знаю, что H2 делает, и я могу только рекомендовать это как встроенную базу данных Java. Если вы не хотите менять базы данных, вы можете посмотреть, разрешает ли Tomcat какую-либо подстановку параметров в своих файлах конфигурации, например ${user.home}. (Некоторые предварительные поиски в Google дают мне результаты списка рассылки, которые, по-видимому, подразумевают, что, по крайней мере, server.xml, так что, возможно, стоит попробовать).

Я до сих пор не совсем уверен, чего вы пытаетесь достичь: вы используете экземпляр Tomcat или это общий экземпляр tomcat, работающий под какой-то системной учетной записью?

Вы также можете попытаться настроить другое доступное для записи место в сети для размещения базы данных. Где-нибудь под /var/, возможно, или просто в папке, установленной на ug=rwx, в домашнем каталоге одного человека.

1 голос
/ 23 апреля 2009

Я все еще ищу способ использования относительного пути к базе данных в файле context.xml.

Однако я разобрался, как получить извлечение пути к базе данных из файла context.xml. Это не красиво, но это работает. Я не мог понять, как проанализировать файл context.xml как XML, поэтому этот уродливый хак ищет строку, начинающуюся с "url=".

URL url = getServletContext().getResource("/META-INF/context.xml");
Properties props = new Properties();
props.load(url.openStream());
String strval = props.getProperty("url");
Pattern pattern = Pattern.compile("\\\W*\"(.\*)\"\\\W*");
Matcher matcher = pattern.matcher(strval);
matcher.find();
String constr = matcher.group(1);
if (constr != null)
    this.jdbcConnectionString = constr;
0 голосов
/ 10 сентября 2017

Этот ответ уже дан хонзами. Я повторяю это, чтобы сделать это более ясным (б / к, я тоже сначала не понял).

jdbc:sqlite:relative/path.db

Это верно для относительного пути. Обратите внимание на отсутствие / перед родственником. Это делает путь абсолютным. Вы также можете использовать это:

jdbc:sqlite:./relative/path.db

. ссылается на текущую папку.

0 голосов
/ 15 февраля 2010

Я нашел ответ на свой вопрос здесь . Решение состоит в том, чтобы получить ресурс, а не пытаться проанализировать URL базы данных из файла context.xml.

0 голосов
/ 01 сентября 2009

У меня была та же проблема с Spring и jdbc.properties. Я исправил ее, удалив // и записав относительный путь

Попробуйте это

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/mywebapp">
    <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="myusername" password="mypassword" driverClassName="org.sqlite.JDBC"
        url="jdbc:sqlite:web/my.db"/>
</Context>
...