4

是否可以在 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 的路径?

4

6 回答 6

9

我发现了以下将 JDBC 与 SQLite 结合使用的示例:

  • 对于内存访问:

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

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

     jdbc:sqlite:/absolute/path.db
    
于 2009-04-24T09:16:55.700 回答
1

我仍在寻找一种在 context.xml 文件中使用数据库相对路径的方法。

但是,我想出了如何从 context.xml 文件中提取数据库的路径。它不漂亮,但它有效。我不知道如何将 context.xml 文件解析为 XML,所以这个丑陋的 hack 会寻找以“ 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;
于 2009-04-23T09:11:02.347 回答
1

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

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

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

您还可以尝试在网络上设置另一个全球可写位置来放置数据库。/var/也许在某个地方,或者只是一个设置ug=rwx在一个人的主目录中的文件夹。

于 2009-04-30T15:16:35.753 回答
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>
于 2009-09-01T11:02:38.130 回答
0

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

于 2010-02-14T21:17:09.130 回答
0

honzas已经给出了这个答案。我重申它以使其更清楚(b / c我一开始也不明白)。

jdbc:sqlite:relative/path.db

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

jdbc:sqlite:./relative/path.db

这 。指当前文件夹。

于 2017-09-10T15:01:46.997 回答