22

我有一个使用 HSQLDB 作为其内部设置数据库的成熟软件产品。客户项目存储在此数据库中。多年来,HSQLDB 为我们提供了相当不错的服务,但它存在一些稳定性/损坏问题,我们不得不围绕这些问题编写代码,即便如此,我们似乎也无法完全保护自己免受这些问题的影响。

我正在考虑更改内部数据库。从开发的角度来看,这样做会相当痛苦,但是向客户解释损坏的数据库(和丢失的数据)并不有趣。

所以我的问题是:是否有人有足够的经验来衡量 Apache Derby 的长期稳定性?我通过 Google 找到了一篇帖子,抱怨 Derby 不稳定,但它是从 2006 年开始的,所以我认为它在过去 4 年中得到了改进。或者,是否有另一个我可以使用的纯 Java 嵌入式(进程内)数据库(商业或开源)。性能对我来说不是很重要。稳定为王。断电时的数据完整性、良好的 BLOB 支持和热备份都是必须的。

请不要建议不是基于 SQL 的关系数据库的东西。我正在尝试改造现有产品,而不是从头开始,谢谢。

4

8 回答 8

21

对于每个数据库引擎,都存在一定的损坏风险。我是 H2 数据库的主要作者,我也收到了有关损坏数据库的报告。测试可以降低出现错误的可能性,但不幸的是,几乎不可能保证某些软件“没有错误”。

至于三个 Java 数据库 HSQLDB、Apache Derby 和 H2,我真的不能说哪一个是最稳定的。我只能说H2。我认为对于大多数操作来说,H2 现在是稳定的。有许多测试用例专门测试数据库是否损坏。这包括对功率损耗的自动测试(使用圣诞灯计时器)。通过电源故障测试,我发现稳定性还取决于文件系统:有时我收到“CRC 错误”消息,这意味着操作系统无法读取文件(它是 Windows)。在这种情况下,您无能为力。

对于关键任务数据,无论如何我都不会依赖稳定的软件。定期创建备份并对其进行测试非常重要。一些数据库有多种方法来创建备份。例如,H2 具有在线备份功能,以及编写 SQL 脚本文件的功能。另一种方法是使用复制或集群。H2支持简单集群模式,相信Derby支持复制。

于 2010-07-03T17:14:14.820 回答
13

我将 Derby 24/7 作为支持构建自动化和测试管理系统的内部数据库运行了 4 年。它被全球团队使用,从未崩溃、丢失数据或损坏我的记录。我们停止使用它的唯一原因是因为我们的公司被另一家收购了,并且下达了更高级别的决定。德比是坚实、可靠的,非常值得您考虑。

于 2010-06-29T22:05:47.707 回答
9

此搜索显示 HSQLDB 用户邮件列表中包含字符串“corrupt”的 215 个帖子。 http://search.gmane.org/?query=corrupt&author=&group=gmane.comp.java.hsqldb.user&sort=date&DEFAULTOP=and&xP=Zcorrupt&xFILTERS=Gcomp.java.hsqldb.user---A

此搜索显示 Derby 用户邮件列表中包含相同字符串的 264 个帖子。 http://search.gmane.org/?query=corrupt&author=&group=gmane.comp.apache.db.derby.user&sort=date&DEFAULTOP=and&xP=Zcorrupt&xFILTERS=Gcomp.apache.db.derby.user---A

这显示了 Derby Dev 邮件列表中的 1003 个帖子,具有相同的字符串 http://search.gmane.org/?query=corrupt&author=&group=gmane.comp.apache.db.derby.devel&sort=date&DEFAULTOP=and&xP=Zcorrupt&xFILTERS=Gcomp .apache.db.derby.devel---A

查看一些帖子可以发现,尽管数据库开发人员尽了最大努力,但仍有可能或真实的数据库损坏案例发生。

HSQLDB 也有自己的数据库损坏问题,但多年来有所改善。在最新版本中,引入了预防措施和修复程序,以防止过去几年报告的所有问题。

然而,新的 lob 存储功能被证明有一个逻辑错误,导致更新后 lob 被“遗忘”。现在正在修复此问题,并通过更广泛的测试来支持修复。

多年来,像 CarlG 这样的用户在 Derby 和 HSQLDB 的错误修复工作中提供了很多帮助。

Fred Toussi,HSQLDB 项目

于 2010-07-03T11:48:29.683 回答
7

有没有人有足够的经验来衡量 Apache Derby 的长期稳定性?(...)

Derby,前 IBM Cloudscape(现在也由 Sun 作为 JavaDB 分发)是一个符合 ACID 的数据库,可以支持大量并发用户,运行嵌入式或服务器模式,并且已知是健壮的并且可以用于生产。它没有 HSQLDB 快(Derby 使用持久操作),但它很健壮。不过,您应该针对它运行自己的测试。

也可以看看

于 2010-06-29T22:19:36.193 回答
5

自 2009 年以来,我一直在我的许多项目中使用 Apache Derby,其中一些项目具有 24/7 全天候运行和数百万行。

从未发生过一次数据损坏事件。坚如磐石,快速。

我一直选择它作为我选择的 RDBMS,除非有充分的理由不弹出。

于 2017-05-17T16:37:36.907 回答
4

尝试查看H2。它是由最初制作 HSQLDB 但从头开始构建的人创建的,因此不使用任何 HSQLDB 代码。不确定它的稳定性与 HSQL 相比如何,因为我已经很久没有使用 HSQL 并且我目前只将 H2 用于短期数据库。我个人发现 H2 比 Derby 更容易上手,但这可能是因为 H2 有一个备忘单网页。

可以重新编码以使用抽象层,然后运行测试以将 H2 和 Derby 与您发现的问题进行比较。

在围栏的项目管理方面,您的路线图是否有一个主要版本?这可能是一个相当合适的时间以这种方式挖出胆量,我不会说你疯了,因为它可能会消除许多难以管理的工作。如果您想在没有大量警告和备份的情况下进行可能影响实时系统的更改,那么您可能会发疯。

于 2010-06-29T21:35:03.977 回答
3

关于 HSQLDB,它作为 SQLite 项目所没有的一件事是强大的测试套件的文档和严格的 ACID 合规性的在线文档。

我并不是要从 HSQLDB 中拿走任何东西。它的目的是作为 MySQL 的替代品,而不是 SQLite 的 fopen() 的替代品。可以说 HSQLDB(实际上是所有 Java RDBMS)的范围更加雄心勃勃。Fredt 和他的团队在 HSQLDB 方面取得了非凡的成就。即便如此,在 Google 搜索“Is HSQLDB ACID compliant”并不会让早期采用者在阅读 SQLite 网站上的测试工具后感到自信。

http://sqlite.org/transactional.html

“SQLite 是事务性的

事务数据库是一种所有更改和查询似乎都是原子的、一致的、隔离的和持久的 (ACID) 的数据库。SQLite 实现了原子的、一致的、隔离的和持久的可序列化事务,即使事务因程序崩溃、操作系统崩溃或计算机电源故障而中断。

我们在这里重述和放大上一句以强调:SQLite 中单个事务中的所有更改要么完全发生,要么根本不发生,即使将更改写入磁盘的行为被中断

  • 程序崩溃,
  • 操作系统崩溃,或
  • 电源故障。

上一段的声明在 SQLite 回归测试套件中得到了广泛的检查,使用一个特殊的测试工具来模拟操作系统崩溃和电源故障对数据库文件的影响。”

http://sqlite.org/testing.html

《1.0简介》

SQLite 的可靠性和健壮性部分是通过彻底和仔细的测试来实现的。

从 3.7.14 版开始,SQLite 库由大约 81.3 KSLOC 的 C 代码组成。(KSLOC 的意思是数千个“源代码行”,或者换句话说,不包括空白行和注释的代码行。)相比之下,该项目的测试代码和测试脚本是 91421.1 KSLOC 的 1124 倍。

1.1 执行摘要

三个独立开发的测试工具 部署配置中的 100% 分支测试覆盖率 数以百万计的测试用例 内存不足测试 I/O 错误测试 崩溃和断电测试 模糊测试 边界值测试 禁用优化测试 回归测试 畸形数据库测试广泛使用 assert() 和运行时检查 Valgrind 分析有符号整数溢出检查"

于 2013-01-27T17:08:30.860 回答
1

如果您正在寻找自包含的东西(不涉及服务器),请尝试 SQLite。这是支持 android 的 db api 的,并且非常稳定。

于 2012-06-15T14:52:53.777 回答