context.xml中SQLite DB的相对路径

时间:2009-04-21 02:07:16

标签: java sqlite netbeans java-ee relative-path

是否可以在Java Web应用程序的context.xml文件中使用SQLite数据库文件的相对路径?

目前,我有:

<?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>

如您所见,Resource标记的url属性当前指定了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)不会更改。


另外,如何从servlet中的context.xml文件中获取数据库文件my.db的路径?

6 个答案:

答案 0 :(得分:9)

我找到了以下使用JDBC和SQLite的示例:

  • 对于内存访问:

     jdbc:sqlite::memory:
    
  • 对于相对路径:

     jdbc:sqlite:relative/path.db
    
  • 对于绝对路径:

     jdbc:sqlite:/absolute/path.db
    

答案 1 :(得分:1)

我仍在寻找一种在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;

答案 2 :(得分:1)

作为一种不同的方法:您是否尝试使用jdbc:sqlite:~/myapp.db?此应该是运行该应用程序的每个人的计算机上的可写位置。 (虽然我已经看到了只读主页的邪恶。)

我不确定SQLite是否支持数据库URL中的~。我知道H2会这样做,我只能推荐它作为嵌入式Java数据库。如果您不想更改数据库,您可能希望查看Tomcat是否允许在其配置文件中进行某些参数替换,例如${user.home}。 (一些初步的谷歌搜索给我的邮件列表结果似乎暗示至少是server.xml的情况,所以值得尝试它。)

我仍然不确定你想要实现的目标:你是运行Tomcat实例的那个,还是在某个系统帐户下运行的共享tomcat实例?

您还可以尝试在网络上设置另一个世界可写位置以将数据库放入。可能位于/var/下的某个位置,或者只是在一个人的主目录中设置为ug=rwx的文件夹

答案 3 :(得分:0)

我遇到了与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>

答案 4 :(得分:0)

我找到了问题here的答案。解决方案是获取资源而不是尝试从context.xml文件中解析数据库URL。

答案 5 :(得分:0)

这个答案已经由honzas给出。我重申要说明一点(b / c我起初也不理解)。

jdbc:sqlite:relative/path.db

这对于相对路径是正确的。注意缺少一个/之前的亲戚。这使得路径绝对。你也可以用这个:

jdbc:sqlite:./relative/path.db

。指当前文件夹。