2011-12-15 88 views
30

我在演示服务器中设置了我的应用程序的新版本,并且很想找到每天重置数据库的方法。我想我总是可以执行cron作业,执行删除操作并创建查询,但我正在寻找更干净的方法。我尝试使用特殊的持久性单元,使用drop-create方法,但由于系统经常(按需)连接和断开服务器,因此它不起作用。定期重置嵌入式H2数据库

有没有更好的方法?

回答

55

H2支持一种特殊的SQL语句drop all objects

DROP ALL OBJECTS [DELETE FILES] 

如果你不想删除所有的表,你可能需要使用truncate table

+0

感谢。我的工作 – javydreamercsw 2011-12-16 18:36:00

+1

TRUNCATE TABLE不会将AUTO_INCREMENT计数器重置为零:( – Nazar 2014-02-14 11:44:01

1

命令:SHUTDOWN
你可以使用RunScript.execute(jdbc_url,user,password,“classpath:shutdown.sql”,“UTF8”,false)来执行它。
我当测试套件使用@AfterClass

12

由于这种反应是首款谷歌结果为“复位H2数据库”,我下面张贴我的解决方案完成每一次运行它:

后每JUnit的@tests

  • 禁用完整性约束
  • 列表中(默认)所有表PUBLIC方案
  • 截断所有表
  • 列表中(默认的)的所有序列PUBLIC模式
  • 复位所有序列
  • 重新启用的约束。

    @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数据库。但是,如果是大数据库,那可能太长了。

1

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脚本(这里我们初始化所有需要的表之前,每个测试方法。

相关问题