2014-09-02 49 views
2

我們使用H2數據庫來執行測試。爲了將每個測試與另一個測試隔離開來,數據庫模式和基本數據設置將在每次測試之前丟棄並重新創建。H2數據庫恢復到特定狀態進行測試

是否可以在首次安裝數據庫之後創建恢復點,並在每次測試之前恢復此點的數據?

SCRIPT只是創建一個包含所有表和數據的sql文件。對我們自己的初始化沒有太大的區別。

問題database restore to particular state for testing是一樣的,只適用於Oracle和Postgres。

+1

那怎麼樣:創建數據庫,然後是備份(文件備份)。在運行每個測試之前,恢復備份?這太慢了嗎?將來,對於H2 1.4.x,可能(而不是還原)簡單地截斷數據庫文件。 – 2014-09-02 14:05:41

+0

我以爲[這個問題](http://stackoverflow.com/questions/6143369/does-the-h2-script-command-work-like-a-snapshot)備份速度較慢,但​​我重讀了答案後我應該測試備份。 – Lukas 2014-09-02 14:25:03

回答

0

一個古老的問題,但我發現它仍然相關。 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清理/恢復過程非常快)。代碼很繁瑣,但值得努力。