我在演示服务器中设置了我的应用程序的新版本,并且很想找到每天重置数据库的方法。我想我总是可以执行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