2

我将 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 工作目录吗?任何帮助表示赞赏。

4

4 回答 4

5

似乎 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

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

于 2012-07-03T04:36:27.043 回答
1

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

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

于 2012-07-02T07:32:41.760 回答
1

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

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

例子

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

于 2012-07-02T08:19:38.010 回答
1

感谢 fredt 的回答,在 Tomcat 8 上找到了答案

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

其中 mydbpath 是具有指定数据库的实际路径的变量。这以某种方式有效

于 2017-04-05T08:24:59.747 回答