【问题标题】:Relative path to SQLite DB in context.xmlcontext.xml 中 SQLite DB 的相对路径
【发布时间】:2010-10-20 17:23:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    • 对于内存访问:

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

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

       jdbc:sqlite:/absolute/path.db
      

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我对 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>
          

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

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

              jdbc:sqlite:relative/path.db
              

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

              jdbc:sqlite:./relative/path.db
              

              .引用当前文件夹。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-10-15
                • 2020-05-18
                • 2019-05-03
                • 1970-01-01
                • 2012-01-02
                • 1970-01-01
                • 2011-06-15
                • 2011-02-05
                相关资源
                最近更新 更多