【问题标题】:Relative path to hsqldb files in a web app doesn't work?Web 应用程序中 hsqldb 文件的相对路径不起作用?
【发布时间】:2012-07-02 14:32:37
【问题描述】:

我将 hsqldb 用于基于 Spring 的 java webapp。我将数据库文件(mydb.lck、mydb.properties、..)放在 src\main\java\data 文件夹中,以便将它们发布到 WEB-INF\classes\data 中。

在数据源配置中,我指定了 JVM 工作目录的相对路径。按照 hsqldb 文档中的指导。

portal.jdbc.url=jdbc:hsqldb:file:/data/mydb(这个分隔符适用于 Windows 吗?)

但Spring似乎没有找到这条路并坚持声称

java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CUSTOMER org.hsqldb.jdbc.Util.sqlException(Unknown Source)

但是,如果我指定一个绝对路径,它会完美运行

portal.jdbc.url=jdbc:hsqldb:file:d:\\TomcatServer\\apache-tomcat-7.0.10\\wtpwebapps\\myportal-app\\data\\mydb

我应该错过了解 Web 应用程序上的 JVM 工作目录吗? 任何帮助表示赞赏。

【问题讨论】:

    标签: java spring tomcat hsqldb


    【解决方案1】:

    似乎 Tomcat 没有为我们提供属性变量(如“webroot”)来引用我的应用程序上下文。所以我的解决方案是在 Servlet 上下文监听器中注册这样的属性。

    我的代码:

     public class WebAppPropertiesListener implements ServletContextListener{
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            String rootPath = sce.getServletContext().getRealPath("/");
            System.setProperty("webroot", rootPath);
    
        }
        ...
     }
    

    并在触发 Spring 上下文之前在 web.xml 中添加监听器

    <listener>
        <listener-class>com.iportal.util.WebAppPropertiesListener</listener-class>
    </listener>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    

    然后我将属性放在 Hsqldb 设置中。

    portal.jdbc.url=jdbc:hsqldb:file:${webroot}WEB-INF/classes/data/mydb
    

    希望这对可能遇到相同问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      HSQLDB 2.2.8 及更高版本允许在连接 URL 中使用变量。该变量可以是任何系统属性,例如 Web 应用程序目录路径。

      http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html#dpc_variables_url

      【讨论】:

      【解决方案3】:

      请参阅“连接 URL 中的变量”部分

      http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

      例子

      jdbc:hsqldb:file:${mydbpath};sql.enforce_types=true

      【讨论】:

      • 谢谢。我通读了,但我看不到如何设置变量 mydbpath。你有什么提示吗?
      • 定义环境变量“user.home”,并尝试在连接路径中使用第一种类型的变量作为“如果文件的数据库部分:数据库以〜/或〜\开头的波浪字符被替换系统属性“user.home”的值导致在此目录或其子目录之一中创建或访问数据库。在下面的示例中,mydb 的数据库文件位于用户的主目录中。jdbc: hsqldb:file:~/mydb;shutdown=true"
      【解决方案4】:

      感谢 fredt 的 answer,在 Tomcat 8 上解决了这个问题。

      url = "jdbc:hsqldb:file:" + mydbpath;
      

      其中 mydbpath 是具有指定数据库的实际路径的变量。 这在某种程度上有效

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 2013-10-25
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多