H2数据库恢复到特定状态进行测试
问题描述:
我们使用H2数据库来执行测试。为了将每个测试与另一个测试隔离开来,数据库模式和基本数据设置将在每次测试之前丢弃并重新创建。H2数据库恢复到特定状态进行测试
是否可以在首次安装数据库之后创建恢复点,并在每次测试之前恢复此点的数据?
SCRIPT只是创建一个包含所有表和数据的sql文件。对我们自己的初始化没有太大的区别。
问题database restore to particular state for testing是一样的,只适用于Oracle和Postgres。
答
一个古老的问题,但我发现它仍然相关。 AFAIK没有恢复点支持。
这是一个简单但快速的备份/恢复方法。
运行的第一个测试之前创建一个备份:
Connection conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;LOG=0");
Statement stat = conn.createStatement();
stat.execute("SCRIPT TO 'memFS:myDatabase.sql'");
stat.close();
conn.close();
每次测试后恢复:
Connection conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;LOG=0");
Statement stat = conn.createStatement();
stat.execute("DROP ALL OBJECTS");
stat.close();
conn.close();
conn = DriverManager.getConnection("jdbc:h2:mem:myDatabase;DB_CLOSE_DELAY=-1;INIT=runscript from 'memFS:myDatabase.sql';LOG=0");
conn.close();
需要注意的是SHUTDOWN
命令竟然是比DROP ALL OBJECTS
快,但它造成的一些问题(连接池无法重新建立连接)。
我不会说上述方法很慢,远非如此。但是,由于上述方法需要一些时间,所以对于大型数据库和数千次测试,仍然有改进的空间。我设法实现了几倍的备份/恢复速度(对于大约350张表,数据库约为15ms),手动编写一个脚本,执行TRUNCATE TABLE
,ALTER SEQUENCE
,并执行INSERT
的所有初始数据(需要SET REFERENTIAL_INTEGRITY FALSE
清理/恢复过程非常快)。代码很繁琐,但值得努力。
那怎么样:创建数据库,然后是备份(文件备份)。在运行每个测试之前,恢复备份?这太慢了吗?将来,对于H2 1.4.x,可能(而不是还原)简单地截断数据库文件。 – 2014-09-02 14:05:41
我以为[这个问题](http://stackoverflow.com/questions/6143369/does-the-h2-script-command-work-like-a-snapshot)备份速度较慢,但我重读了答案后我应该测试备份。 – Lukas 2014-09-02 14:25:03