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 忽略服务器上表上的第一个插入操作(服务器需要“预热”?)的主要内容,如果未能解决你的问题,请参考以下文章