我想覆盖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()
将数据库重置为原始状态。请不要问/告诉我还有其他方法可以重置数据库,实际问题是为什么它不会覆盖我的文件。
答案 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()
。
我想做的是:
SELECT
,INSERT
做一些事情,然后做一些断言。基本上对数据库测试一些东西。PS:我在文件模式下使用HSQLDB。