hsqldb 忽略服务器上表上的第一个插入操作(服务器需要“预热”?)

Posted

技术标签:

【中文标题】hsqldb 忽略服务器上表上的第一个插入操作(服务器需要“预热”?)【英文标题】:hsqldb ignores first insert operation on table at server (server needs to be "warmed up"?) 【发布时间】:2011-03-28 09:03:38 【问题描述】:

我们遇到了一个非常奇怪的 hsqldb 问题。我们正在运行一些在 mysql 上运行良好的测试,但我们最近切换到 hsqldb 进行单元测试。在这样做的过程中,我们注意到我们的一些测试开始失败。其中一个测试插入三个记录 A、B 和 C,并尝试检索前两个记录 A 和 B。但是,当我们第一次在新配置的(空)数据库上运行测试时,只返回 B。但是,如果我们在同一个数据库上重复测试,A'和B'都会返回(在你问之前,是的,A、B和C与A'、B'和C'不同)。

我们试图强制数据库持久化记录,并且我们插入了延迟。除了通过一次插入“预热数据库”之外似乎没有任何帮助。如果我们之后检查 hsqldb 日志,它们会包含所有插入语句,即使是我们在第一次在数据库上运行时无法使用 SELECT 检索的语句。

是否有人遇到过需要使用虚拟插入语句“预热” hsqldb 的问题?如果我们在运行测试之前使用垃圾执行插入语句,它们也将成功完成。

我们已经在 hsqldb 2.0.0 和 2.1.0 上进行了测试。两个版本产生相同的结果。

【问题讨论】:

【参考方案1】:

真正的答案是 OP 在其中一个 cmets 中给出的。 HSQLDB 不会忽略第一次插入。默认情况下,HSQLDB 和 MySQL 分别使用 0 和 1 作为为表中的标识列生成的第一个自增值。 OP 的查询假定第一个值是 MySQL 值 (1)。

使用 HSQLDB,GENERATED BY DEFAULT AS IDENTITY START WITH 1 可用于定义自动增量列以匹配 MySQL 默认值。

【讨论】:

【参考方案2】:

我从来没有用过hsqldb,但是你试过INSERT INTO ...; COMMIT;然后运行SELECT ..吗?

延迟数据库操作(INSERT、UPDATE 或 DELETE)并非不合理。当数据库负载不重但您不能指望它时,它可能不应该发生。

【讨论】:

插入使用显式调用从 java 中提交。有一个潜在的回滚,但不幸的是,我们的测试中从未调用过。我们考虑了延迟的持久性,但尝试休眠 5 秒(绰绰有余)并不能解决问题。它也没有解释为什么返回 last 记录,而不是第一条记录(如果有的话,第一条记录应该在第二条之前保留)。 你有什么 TransactionIsolation 级别? 你可以试试设置:setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 感谢您的建议。我们对其进行了测试,但不幸的是它不起作用。 好吧,我放弃了。也许这是一个错误。您可以尝试使用虚拟查询(不是 INSERT)“预热”数据库。

以上是关于hsqldb 忽略服务器上表上的第一个插入操作(服务器需要“预热”?)的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB:内存表和数据丢失

HSQLDB如何插入100万条记录

条件插入作为 HSQLDB 1.8 中的单个数据库事务?

如何知道 Hsqldb "MERGE INTO" 是不是进行了插入或更新

从固定格式的文本文件批量插入忽略行终止符

插入 HSQLDB 的更新