无法删除 HSQLDB 文件

Posted

技术标签:

【中文标题】无法删除 HSQLDB 文件【英文标题】:Can´t delete HSQLDB files 【发布时间】: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 块中的连接,无论身份验证错误如何......

谢谢你,原谅我的英语!

【问题讨论】:

【参考方案1】:

您无法删除数据库,因为此时它已打开。

当存在现有安装并且您连接(即使使用错误的凭据)时,首先打开数据库以检查用户名和密码。如果检查失败,则不会关闭数据库,因为通常会再次尝试使用正确的凭据进行连接。

如果新安装未完成,您只需使用具有管理员权限的帐户执行 SQL 语句“SHUTDOWN”。这允许您删除数据库。

【讨论】:

谢谢弗雷特!我现在明白发生了什么,但不幸的是我不能假设我知道已安装数据库的正确凭据,所以我不能发送关闭命令,因为我不能连接......你知道在为了解决这个问题?谢谢! 没关系,我为我的具体情况找到了解决方法,所以我不需要删除数据库:)

以上是关于无法删除 HSQLDB 文件的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 无法删除未找到的外键约束对象

在 HSQLDB 上使用 Spring DBUnit 进行休眠和 Spring 数据 - 由于外键约束而无法删除

HSQLDB 删除所有数据和配置文件

HSQLDB - 更改过程的特定名称

删除或缩小 HSQLDB 数据库中的 lobs 文件

HSQLDB:.script 文件在多个项目执行[多线程环境]并行期间自动被删除?