覆盖现有文件

时间:2016-01-16 18:03:49

标签: java copy hsqldb overwrite

我想覆盖2个文件。 这两个文件都存储有关我的内存数据库(HSQLDB)的信息: db.data和db.script

我的以下代码应该这样做:

public class DBReset {
    public Path db_data = Paths.get("db_sep/db_backup/db.data");
    public Path db_script = Paths.get("db_sep/db_backup/db.script");
    public Path dest_data = Paths.get("db_sep/db.data");
    public Path dest_script = Paths.get("db_sep/db.script");

    public void discard() throws IOException {
        Files.copy(this.db_data, this.dest_data, StandardCopyOption.REPLACE_EXISTING);
        Files.copy(this.db_script, this.dest_script, StandardCopyOption.REPLACE_EXISTING);
    }
}

但是,如果我使用

public Class anotherClass {
    new DBReset.discard();
    // do something with DB
    new DBReset.discard();
    // do something other with DB
}

第二个discard()不会覆盖我的文件。

我使用discard()将数据库重置为原始状态。请不要问/告诉我还有其他方法可以重置数据库,实际问题是为什么它不会覆盖我的文件。

2 个答案:

答案 0 :(得分:0)

看来你没有SHUTDOWN数据库。如果数据库已打开,则无法覆盖.data文件。完成数据库处理后,执行以下SQL语句:

 SHUTDOWN

这应该由访问数据库的程序执行:

new DBReset.discard();
// do something with DB -- then perform SHUTDOWN in the same java process

答案 1 :(得分:0)

可悲的是SHUTDOWN不起作用。

public void discard() throws IOException, SQLException {
    Connection c = DBConnectFactory.getDataSource.getConnection();
    PreparedStatement ps = c.preparedStatement("SHUTDOWN"); 
    ps.executeUpdate();
    ps.close();
    c.close();

    Files.copy(this.db_data, this.dest_data, StandardCopyOption.REPLACE_EXISTING);
    Files.copy(this.db_script, this.dest_script, StandardCopyOption.REPLACE_EXISTING);
}

Connection c = DBConnectFactory.getDataSource.getConnection(); java.sql.Exception: error in script file line: 1 unknown token: ...多个未知来源的第一行投掷。

还在我的runQuery(String query)中测试 - 打开一个连接,然后通过PreparedStatement执行给定的查询 - 强制SHUTDOWN,但它会抛出与上面相同的错误,我应该得到一个连接在getConnection()

我想做的是:

  1. 恢复原始数据库实例。
  2. 使用数据库SELECTINSERT做一些事情,然后做一些断言。基本上对数据库测试一些东西。
  3. 恢复原始数据库实例。
  4. 对数据库进行一些其他测试。
  5. PS:我在文件模式下使用HSQLDB。