HSQLDB索引不一致

时间:2012-09-27 16:09:37

标签: database jdbc hsqldb indexing

我在java项目中遇到过HSQLDB的奇怪行为。非常简单的查询返回不一致的结果。我将问题追溯到一些表格的索引不是最新的。不幸的是,我既不是SQL专家,也不是java中的数据库。

HSQLDB版本是2.2.8。我试图更新到2.2.9,但这没有帮助。

我们的数据库非常简单。它包含几个独立的表。他们之间没有关系。每个表都配有索引,其中一个是组合多个列的唯一索引。这是一个例子:

CREATE CACHED TABLE PUBLIC.MYTABLE(
  A BIGINT DEFAULT -9999 NOT NULL,
  B BIGINT DEFAULT -9999 NOT NULL,
  C NUMERIC(12,7) DEFAULT -9999.0000000 NOT NULL,
  D INTEGER DEFAULT -9999 NOT NULL);

CREATE INDEX IDX1 ON PUBLIC.MYTABLE( A );
CREATE INDEX IDX2 ON PUBLIC.MYTABLE( B );
CREATE INDEX IDX3 ON PUBLIC.MYTABLE( C );

CREATE UNIQUE INDEX MYTABLE_PRIMARY_KEY ON PUBLIC.MYTABLE( A, B );

我们通常从java程序插入行和查询表,永远不会更新现有行。插入操作如下所示:

Connection con = ...; // get connection from 
PreparedStatement stmt;

con.setAutoCommit( false );

stmt = this.con.prepareStatement( 
    String.format( 
       "insert into %s values (?,?,?,?)", "MYTABLE"));

stmt.setLong(1, data1);
stmt.setLong(2, data2);
stmt.setDouble(3, data3);
stmt.setInt(4, data4);

stmt.addBatch()

以及我们执行批处理的其他地方

stmt.executeBatch();
stmt.clearBatch();
con.commit();

代码在循环中执行,之后我们用适当的方法关闭语句和连接。此外,连接url在结尾处有“shutdown = true”,因此我们希望数据库正确关闭。

正如我之前提到的,我在SQL查询时注意到了这个问题,例如

SELECT COUNT(*) FROM MYTABLE

开始返回不合理的结果,例如它只返回了预期行数的一半左右。作为一项实验,我从表中删除了唯一索引,并且所有查询都正常工作。这就是为什么我认为由于某种原因索引没有在插入上正确更新。查看索引的线索来自谷歌搜索和阅读留言板和论坛上的评论。

Disable and rebuild an index in HSQLDB所述

SHUTDOWN COMPACT

并且修复了我们数据库中的所有表,所有数据都存在,所有查询都返回正确的结果。我怀疑那个问题的作者有类似我的问题。

好的,我的数据是安全的,所以我想了解并纠正问题的根源。

索引是否应该在插入时更新?或者这是一个错误的假设,我们每次更新数据库时都需要执行SHUTDOWN COMPACT?

多列上的唯一索引是否可能是问题的根源?

我将不胜感激任何建议或指示。

1 个答案:

答案 0 :(得分:0)

索引始终在插入/删除/更新时更新。为此目的,不需要执行SHUTDOWN COMPACT。

目前尚不清楚导致不一致的原因。如果您可以使用虚拟数据重现它,那么将测试用例提交给HSQLDB项目并进行调查。