java - 关闭 UCanAccess 连接后无法删除数据库文件

标签 java jdbc ucanaccess

我使用UCanAccess连接到临时Access文件读取数据,之后我想删除这些临时文件。但是,我总是得到 file.delete()=false

这是我的代码

public class JAccess {
    static Connection conn;
    static Statement stat;

    public static void connect(String DBFilename) {
        try {used ucanaccess to connect temporary access files
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
            String DataSource = "jdbc:ucanaccess://" + DBFilename;
            String user = "user";
            String pw = "pw";
            conn = DriverManager.getConnection(DataSource, user, pw);
            stat = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public static void disconnect() {
       try {
            stat.close();
            conn.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        stat = null;
        conn = null;
    }
}


public void SelectTable(String DBFilename) throws SQLException {
    JAccess.connect(DBFilename);
    JAccess.disconnect();
}

public static void main(String[] args) throws SQLException {
.........
    SelectTable(DBFilename);
    File f = new File(DBFilename);
    f.delete();

为什么 f.delete() 失败了?

最佳答案

默认情况下,UCanAccess 使用immediatelyReleaseResources=false 打开到数据库文件的连接。在这种情况下,当 java.sql.Connection 关闭时,UCanAccess 实际上会保持文件句柄和 HSQLDB 资源打开一小段时间,以防应用程序想要重新建立与数据库。例如,对于为每个操作打开和关闭数据库连接的 ORM,可能会发生这种情况。但是,这也意味着无法在连接关闭后立即删除临时数据库文件,因为 UCanAccess 仍然打开着该文件。

如果我们在连接 URL 中指定 immediatelyReleaseResources=true 那么 UCanAccess 将在 java.sql.Connection 之后尽快关闭文件句柄并释放 HSQLDB 资源关闭了。这通常是 ETL 作业和其他需要“一次性”连接到数据库文件的任务的首选行为。

关于java - 关闭 UCanAccess 连接后无法删除数据库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44068760/

相关文章:

java - 忽略 MS Access 中的特定列 SELECT DISTINCTROW

java - Android - 如何将图像存储在已创建的 Firestore 文件夹中

java - 合并2个具有相同结构的数据库

java - 比较 ArrayList 中的数字

database - 使用 jdbc 插入多个表

java - 从数据库中获取值后如何清除 jComboBox

java - Mysql驱动本身是否实现了DataSource接口(interface)?

java - UCanAccess数据异常: numeric value out of range

java - jsoup 解析非典型标记

java - 在没有 ODBC 的情况下从 Java 操作 Access 数据库