我在演示服務器中設置了我的應用程序的新版本,並且很想找到每天重置數據庫的方法。我想我總是可以執行cron作業,執行刪除操作並創建查詢,但我正在尋找更乾淨的方法。我嘗試使用特殊的持久性單元,使用drop-create方法,但由於系統經常(按需)連接和斷開服務器,因此它不起作用。定期重置嵌入式H2數據庫
有沒有更好的方法?
我在演示服務器中設置了我的應用程序的新版本,並且很想找到每天重置數據庫的方法。我想我總是可以執行cron作業,執行刪除操作並創建查詢,但我正在尋找更乾淨的方法。我嘗試使用特殊的持久性單元,使用drop-create方法,但由於系統經常(按需)連接和斷開服務器,因此它不起作用。定期重置嵌入式H2數據庫
有沒有更好的方法?
命令:SHUTDOWN
你可以使用RunScript.execute(jdbc_url,user,password,「classpath:shutdown.sql」,「UTF8」,false)來執行它。
我當測試套件使用@AfterClass
由於這種反應是首款谷歌結果爲「復位H2數據庫」,我下面張貼我的解決方案完成每一次運行它:
後每JUnit的@tests:
重新啓用的約束。
@After
public void tearDown() {
try {
clearDatabase();
} catch (Exception e) {
Fail.fail(e.getMessage());
}
}
public void clearDatabase() throws SQLException {
Connection c = datasource.getConnection();
Statement s = c.createStatement();
// Disable FK
s.execute("SET REFERENTIAL_INTEGRITY FALSE");
// Find all tables and truncate them
Set<String> tables = new HashSet<String>();
ResultSet rs = s.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='PUBLIC'");
while (rs.next()) {
tables.add(rs.getString(1));
}
rs.close();
for (String table : tables) {
s.executeUpdate("TRUNCATE TABLE " + table);
}
// Idem for sequences
Set<String> sequences = new HashSet<String>();
rs = s.executeQuery("SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA='PUBLIC'");
while (rs.next()) {
sequences.add(rs.getString(1));
}
rs.close();
for (String seq : sequences) {
s.executeUpdate("ALTER SEQUENCE " + seq + " RESTART WITH 1");
}
// Enable FK
s.execute("SET REFERENTIAL_INTEGRITY TRUE");
s.close();
}
另一解決辦法是在每個試驗的開始時到recreatethe數據庫。但是,如果是大數據庫,那可能太長了。
THRE是數據庫操作在Spring的特殊語法內進行單元測試
@Sql(scripts = "classpath:drop_all.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
@Sql(scripts = {"classpath:create.sql", "classpath:init.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
public class UnitTest {}
在這個例子中,我們每個測試方法之後執行drop_all.sql腳本(我們dropp所需的所有表)。 在這個例子中,我們執行create.sql腳本(這是我們創建所有需要的表),並init.sql腳本(這裏我們初始化所有需要的表之前,每個測試方法。
感謝。我的工作 – javydreamercsw 2011-12-16 18:36:00
TRUNCATE TABLE不會將AUTO_INCREMENT計數器重置爲零:( – Nazar 2014-02-14 11:44:01