【问题标题】:Overwrite existing file覆盖现有文件
【发布时间】:2016-04-22 04:22:03
【问题描述】:

我想覆盖 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() 将我的数据库重置为其原始状态。请不要问/告诉我还有其他方法可以重置数据库,实际问题是为什么它不会覆盖我的文件。

【问题讨论】:

    标签: java copy hsqldb overwrite


    【解决方案1】:

    您似乎没有关闭数据库。如果数据库已打开,则无法覆盖.data 文件。完成对数据库的操作后,执行下面的 SQL 语句:

     SHUTDOWN
    

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

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

    【讨论】:

    • 如果我这样做,将无法建立与数据库的所有后续连接。我想做的事:new DBReset.discard(); // make sure DB instance is the original one,然后在new DBReset.discard(); // reset DB 之后测试用户 1 受限数据库访问,然后测试另一个用户
    • 很简单。您必须在访问数据库后和删除文件之前关闭。
    【解决方案2】:

    遗憾的是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. 对 DB 做一些事情,SELECTINSERT,然后做一些断言。基本上是针对数据库测试一些东西。
    3. 恢复原始数据库实例。
    4. 对数据库进行一些其他测试。

    PS:我在文件模式下使用 HSQLDB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2015-01-20
      相关资源
      最近更新 更多