2013-03-19 392 views
3

有没有办法在应用程序启动H2数据库之前检查数据库损坏?如果我发现数据已损坏,我想在应用程序启动时从备份zip文件运行自动恢复。H2数据库损坏

我不能通过连接数据库来检查它,因为如果数据库文件存在,即使它是空的,我仍然可以连接并生成默认表。

我也在考虑对数据库中的每个表做一个select语句以确保它的工作。我没有在H2数据库中找到任何内置的sql函数来检查数据损坏。

+0

还要考虑检查'DatabaseMetaData'。 – trashgod 2013-03-19 16:58:30

+0

我发现那里allTablesAreSelectable()应该可以检查是否可以查询所有表:) – Lubos 2013-03-19 23:04:18

回答

2

要检查数据库文件是否存在,如果该文件存在,你可以使用

if (new java.io.File(databaseFileName).exists()) { ... } 

,但数据库已损坏,那么通常你将无法连接到它(尝试连接就会抛出一个例外)。这是我知道验证它的最快方式。

数据库文件存在,但没有完全初始化的风险很小。如果是这样的话,那么一些表格就不存在了。验证所有表的标准方法是使用DatabaseMetaData.getTables

但是,除非您使用某些危险功能(例如禁用事务日志或禁用数据库文件锁定),否则如果使用最新版本的H2,数据库不应该损坏。如果数据库确实损坏,那么这可能是您如何使用H2的一个问题,或者可能是H2本身的错误。向H2 Google Group发送包含详细信息的邮件可能很有意义。

+0

实际上,有一个例外:如果我手动删除数据库文件的全部内容,不会抛出异常,但在下一个初始化新的空数据库被创建 - 可能它的目的是这样做...我的观点是检查数据库结构是否正常。但总的来说,你是对的 - 通常会有数据库损坏的异常。 – Lubos 2013-03-19 20:26:59

+0

只需提醒您,硬件也可能导致内存损坏或存储空间不足。对数据库进行完整性检查非常有价值。 – 2015-07-03 16:48:23

+0

是的,H2确实使用校验和。 – 2015-07-05 05:33:17