【发布时间】:2014-02-27 16:32:02
【问题描述】:
我正在开发一个基本上是安装程序的应用程序。在启动时创建一个 HSQL 数据库、一个模式并插入一些数据。之后,如果满足某些条件,我想完全删除数据库(包括文件),例如,如果安装由于某种原因失败。在我的特殊情况下,当用户想要将应用程序安装在已经安装了应用程序的文件夹中时,一定会发生错误。因为 HSQLDB 已经存在同名且凭据已更改,所以当我尝试使用默认凭据连接到数据库时,会在架构创建时发生错误。
在我发现这个错误之后,我遇到的问题是,当我尝试删除数据库所在的目录时,我收到一个错误,因为 .log 文件被锁定(并且它必须来自我正在运行的应用程序拿着那个锁,但我不知道为什么)。
这是在授权错误之前执行的相关代码:
private static void createDB(String dbName, String dbPath) {
Server server = new Server();
server.setDatabaseName(0, dbName);
server.setDatabasePath(0, "file:" + dbPath);
server.setSilent(true);
server.setRestartOnShutdown(false);
server.signalCloseAllServerConnections();
server.setNoSystemExit(true);
server.start();
server.stop();
server.shutdown();
}
private static void createSchema() throws SQLException, FileNotFoundException, IOException {
Connection conn = null;
try {
conn = DBManager.getConnection(); <---- AUTH ERROR HAPPENS HERE!
ScriptRunner runner = new ScriptRunner(conn, true, true);
runner.runScript(new BufferedReader(new FileReader("someScript.sql")));
runner.runScript(new BufferedReader(new FileReader("someScript.sql")));
} finally {
DBUtils.closeQuietly(conn);
}
}
在我捕获 auth 异常后,我尝试通过以下操作删除 hsqldb 文件夹:
File directoryFile = new File(dirPathDB);
org.apache.commons.io.FileUtils.deleteQuietly(directoryFile);
但我收到一条错误消息“无法删除文件 somepath/somelogfile.log” 我不知道为什么会发生这种情况,因为我正在关闭 finally 块中的连接,无论身份验证错误如何......
谢谢你,原谅我的英语!
【问题讨论】: