hsqldb *.script.new 创建和删除

Posted

技术标签:

【中文标题】hsqldb *.script.new 创建和删除【英文标题】:hsqldb *.script.new creating and deletion 【发布时间】:2015-10-06 15:37:39 【问题描述】:

我有一个 mydata.properties 和 mydata.script 形式的 HSQLDB 1.8。在 mydata.script 中,有一些基本的 SQL 语句来创建模式和填充数据库。

当我使用标准的 Java JDBC 调用加载这个数据库时,我注意到在文件系统上,似乎发生了以下情况:

    正在创建文件 mydata.script.new。 文件 mydata.script 已删除。 mydata.script.new 重命名为 mydata.script

如何防止 mydata.script 被删除?这是正常的 HSQLDB 行为吗?

我希望 mydata.script 始终在文件系统中保留(及其时间戳),它是作为只读数据源的。

编辑:manual 确实声明这是附录 C 中的默认行为。在我的用例中,多个程序(不仅是 Java)读取了这个数据库。如果一个程序第一次尝试读取 .script 文件,就在因为另一个程序第一次访问而被删除时,会导致错误。

EDIT2:如果上面确实不可能,有没有办法将这个 mydata.script(包含所有 SQL 调用)转换为一些二进制 HSQLDB blob 格式,该格式只是通过 JDBC 加载而没有修改?

【问题讨论】:

因此您希望将此 HSQLDB 数据库用作多个应用程序的持久只读资源,其中一些应用程序未用 Java 实现,它们可能会尝试同时访问数据库。对吗? 没错。需要的是让这个只读 HSQLDB 文件/数据始终简单地存在于文件系统中。 【参考方案1】:

根据您的使用案例,HSQLDB 可能不是适合这项工作的工具。

听起来您想从多个应用程序访问数据库in-process,但 HSQLDB 不支持。来自Deployment Guide 的“管理数据库连接”部分:

在所有运行模式(服务器或进程内)中,都支持与数据库引擎的多个连接。 in-process(独立)模式支持来自同一 Java 虚拟机中客户端的连接,

因此,如果您想要来自不同进程的多个并发连接,您应该在“服务器”模式下使用 HSQLDB,但您可能不想为此烦恼。

此外,HSQLDB 与 Java 紧密相关,因此如果您有非 Java 应用程序想要访问数据,您可能会让您的生活变得比实际需要的更加艰难。

另一种数据库格式,可能是 SQLite,可能更适合您。

【讨论】:

【参考方案2】:

您可以从多个进程同时访问只读 HSQLDB 数据库。将此行添加到属性文件以使数据库为只读:

readonly=yes

【讨论】:

【参考方案3】:

我找到了问题的答案:有一个 modified 属性,当在 HSQLDB .properties 文件中设置为 no 时,将阻止我的问题中观察到的行为。

【讨论】:

以上是关于hsqldb *.script.new 创建和删除的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 删除所有数据和配置文件

HSQLDB 和 SQuirreL 中的批量删除

从脚本创建和填充 HSQLDB

在 HSQLDB 中截断模式

无法删除 HSQLDB 文件

为 hsqldb 创建架构时出现语法错误