Java Can´;t删除HSQLDB文件
我正在开发一个基本上是安装程序的应用程序。启动时,创建一个HSQL数据库、一个模式并插入一些数据。之后,如果满足某些条件,我希望完全删除数据库(包括文件),例如,如果由于某种原因安装失败。在我的特殊情况下,当用户希望将应用程序安装到已经安装了应用程序的文件夹中时,必须发生错误。由于HSQLDB已经存在,并且具有相同的名称,并且凭据已更改,因此当我尝试使用默认凭据连接到db时,会在模式创建时发生错误 在我发现这个错误后,我遇到的问题是,当我试图删除数据库所在的目录时,我得到了一个错误,因为.log文件被锁定(它必须来自我正在运行的应用程序,该应用程序持有该锁定,但我不明白为什么) 以下是在授权错误之前执行的相关代码:Java Can´;t删除HSQLDB文件,java,jdbc,hsqldb,Java,Jdbc,Hsqldb,我正在开发一个基本上是安装程序的应用程序。启动时,创建一个HSQL数据库、一个模式并插入一些数据。之后,如果满足某些条件,我希望完全删除数据库(包括文件),例如,如果由于某种原因安装失败。在我的特殊情况下,当用户希望将应用程序安装到已经安装了应用程序的文件夹中时,必须发生错误。由于HSQLDB已经存在,并且具有相同的名称,并且凭据已更改,因此当我尝试使用默认凭据连接到db时,会在模式创建时发生错误 在我发现这个错误后,我遇到的问题是,当我试图删除数据库所在的目录时,我得到了一个错误,因为.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);
}
}
但是我得到一个错误,说“无法删除文件somepath/somelogfile.log”
我不知道为什么会发生这种情况,因为我正在关闭finally块中的连接,不管auth错误是什么
谢谢你,请原谅我的英语 您无法删除数据库,因为它此时处于打开状态 如果存在现有安装,并且您进行了连接(即使使用了错误的凭据),则会首先打开数据库以检查用户名和密码。如果检查失败,则数据库不会关闭,因为通常会再次尝试使用正确的凭据进行连接
如果新安装未完成,您只需使用具有管理员权限的帐户执行SQL语句“SHUTDOWN”。这允许您删除数据库。谢谢您,弗雷德!我现在知道发生了什么,但我不能假定我知道已安装数据库的正确凭据,因此我无法发送关机命令,因为我无法连接。。。你知道解决这个问题的其他方法吗?谢谢没关系,我为我的具体案例找到了一个解决方法,因此我不需要删除数据库:)
File directoryFile = new File(dirPathDB);
org.apache.commons.io.FileUtils.deleteQuietly(directoryFile);