是否无法将数据库/目录导出到 HSQLDB 中的单个文件

Posted

技术标签:

【中文标题】是否无法将数据库/目录导出到 HSQLDB 中的单个文件【英文标题】:Is it not possible to export a database/catalog to a single file in HSQLDB 【发布时间】:2014-01-09 16:03:57 【问题描述】:

我正在刷新/重写我几年前编写的数据分析应用程序。我想要实现的目标如下:

我需要一个轻量级数据库来进行查询,我决定使用 HSQLDB。 我将有 2 个申请;一个用于创建数据库,一个用于分析(将被其他人使用)。我的意图是分析软件(多线程)将以只读方式使用数据库 DB 可能会通过 FTP 分发,并且最好为分析软件的用户(其中​​大多数技术不熟练)的用户提供最少的麻烦。

我不太了解 SQL,但我设法将信息放入表中并尝试了简单的查询。因此,为了完成“数据库创建者”应用程序,我只需要弄清楚如何“打包”数据库。

当我生成数据库时,我已经对 memfile “目录”as described in the HSQLDB user guide 进行了试验。在我看来,对于 mem 目录,我无法将它们写入磁盘(以便稍后分发),对于 file 目录,我有几个文件需要处理:

一个文件:目录由 2 到 6 个文件组成,所有文件名称相同 但具有不同的扩展名,位于同一目录中。为了 例如,名为“test”的数据库包含以下文件:

• 测试属性

• 测试脚本

• 测试日志

• 测试数据

• 测试备份

• 测试.lobs

属性文件包含一些关于数据库的设置。脚本文件包含表和其他数据库对象的定义,以及非缓存表的数据。日志文件包含 最近对数据库的更改。数据文件包含以下数据 缓存表和备份文件是最后一个压缩备份 已知一致状态 的数据文件。所有这些文件都是必不可少的,永远不应删除。对于某些目录,test.data 和 test.backup 文件 不会出现。除了这些文件之外,还有一个 HyperSQL 数据库 可以链接到任何格式化的文本文件,例如 CSV 列表,位于任何地方 磁盘。

问题:

    我认为*.script*.properties 文件是最重要的文件,但指南特别指出所有文件都是必不可少的,不应删除。由于在我的情况下没有*.data 文件,并且生成我的数据库的所有数据都存储在*.script 文件中(以明文形式),这让我认为当我“打开”该文件时,JVM 会重新创建整个数据库重新来过。它是否正确?这不是非常低效的数据表示吗?

    如果我在 (1) 中的理解是正确的,为什么其他文件是必不可少的?我必须全部分发吗?

    如果 (1) 和 (2) 没有偏离轨道,那么我有哪些选择来实现我的目标?例如,压缩所有文件并以这种方式传输它们是否可行?然后我的分析软件需要将它们解包到一个合理的位置,并在它“拥挤”时不时进行清理......

【问题讨论】:

可以使用script命令:hsqldb.org/doc/2.0/guide/management-chapt.html#N1482D @a_horse_with_no_name 不确定我是否理解,脚本命令显然创建了一个包含 SQL 语句的脚本以重新创建数据库。这不是我已经拥有的.script 文件吗?用户手册 (HSQLDB) 的第 3 页指出:“A res: catalog 由小型只读数据库的文件组成,该数据库可以存储在 Java 资源(如 ZIP 或 JAR 存档)中并作为一部分分发Java 应用程序。”,这就是我希望实现的目标 【参考方案1】:

    如果没有 *.data 或 *.lobs 文件,则 .script 文件包含所有数据以及表定义。在这种情况下,JVM 通过读取 .script 文件来重新创建数据库。

    如果存在,其他文件是必不可少的。如果您不使用 LOB,则不会有 .lobs 文件。如果不磁盘表(CACHED表),就没有.data文件。

    您只能分发 .script 文件。每次打开此文件时,如果不存在,将创建一个 .properties 文件。

    如果您的数据库没有更改,您可以使用 res: 选项。对于更改并需要重新加载的数据库,请使用 file: 选项。

【讨论】:

以上是关于是否无法将数据库/目录导出到 HSQLDB 中的单个文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 HSQLDB 的悲观行锁定

比较 hsqldb 中的两个表

为导出 SQL 的 hsqldb 创建 ER 图

从 HSQLDB LOBS 文件增长中恢复的最佳方法

使用UTF-8编码导出HSQLDB数据库

是否应该序列化对存储在 hsqldb 数据库中的文件的访问?