H2 数据库表上的 SQL 查询引发 ArrayIndexOutOfBoundsException

Posted

技术标签:

【中文标题】H2 数据库表上的 SQL 查询引发 ArrayIndexOutOfBoundsException【英文标题】:SQL query on H2 database table throws ArrayIndexOutOfBoundsException 【发布时间】:2014-10-15 05:29:47 【问题描述】:

我有一个 H2 数据库,其中一些查询可以工作,而另一些则抛出 ArrayIndexOutOfBoundsException

例如:

SELECT COLUMN_1 FROM MY_TABLE; // works fine


SELECT COUNT(COLUMN_1) FROM MY_TABLE; // gives following error message:
[Error Code: 50000, SQL State: HY000]  
General error: "java.lang.ArrayIndexOutOfBoundsException"; 
SQL statement: SELECT COUNT(COLUMN_1) FROM MY_TABLE [50000-167]

这个错误信息的原因是什么?

【问题讨论】:

你能发布完整的堆栈跟踪吗?请注意根据错误码,这是H2版本1.3.167,比较老了。 感谢您指出旧的 H2 版本。我不知道它变得如此过时。尝试再次获取堆栈跟踪使我走上了正确的道路(请参阅下面的答案),所以谢谢:-) 【参考方案1】:

错误消息的原因是数据库损坏。

我使用 H2 恢复工具解决了这个问题。步骤如下:

    创建恢复脚本

    C:\PATH_TO_CORRUPT_DB>java -cp C:\PATH_TO_MY_H2\h2.jar org.h2.tools.Recover
    

    删除旧的 db 文件(当然,要先制作备份副本 ;-))

    重新创建数据库

    C:\PATH_TO_CORRUPT_DB>java -cp C:\PATH_TO_MY_H2\h2.jar org.h2.tools.RunScript -url jdbc:h2:PATH_TO_CORRUPT_DB\NAME_OF_DB -script NAME_OF_SCRIPT_FROM_STEP_ONE.sql
    

在这里你可以找到more detailed usage description of the H2 Recovery Tool

【讨论】:

以上是关于H2 数据库表上的 SQL 查询引发 ArrayIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章

使用 2GB+ 加速单个表上的 SQL 查询

自引用表上的 SQL 递归查询 (Oracle)

添加新的可空列后,是不是需要更新某个表上的每个 C# SQL 查询?

SQL - 连接表上的查询

优化大型表上的 SQL 连接

更新查询在同一张表上的 Sql 查询死锁