• java 关闭access文件资源后,无法删除文件


    复现问题

     // 数据库驱动
     String DRIVER_CLASS = "net.ucanaccess.jdbc.UcanaccessDriver";
     // 数据库连接地址
     String DB_URL = "jdbc:ucanaccess://D/test.mdb";
     String DB_USER = ""; // 数据库用户名称
     String DB_PASSWORD = "";// 数据库用户密码
     accessDriverHelper = new AccessDriverHelper(DRIVER_CLASS, DB_URL, DB_USER, DB_PASSWORD);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这样子打开mdb文件后,close连接,使用file.delete()无法被删除,会提示被JVM占用。

    原因

    默认情况下,Access 使用immediatelyReleaseResources=false 打开到数据库文件的连接。在这种情况下,当 java.sql.Connection 关闭时,Access 实际上会保持文件句柄和 HSQLDB 资源打开一小段时间,以防应用程序想要重新建立与数据库。

    // 数据库连接地址
                /*
                 * memory:驱动程序属性memory默认是true的,当处理大型数据库,如果JVM内存不足,将会造成JVM内存溢出,建议使用者
                 * 使用-Xms和-Xmx选项为JVM分配足够的内存。否则,必须将驱动程序的“memory”属性设置为“false”。
                 *
                 * Skipindexes:(UCanAccess 2.0.9.4版本以后):为了最小化内存占用,它允许跳过简单索引的创建。它对引用完整性约束
                 *
                 * ignorecase:文本的大小写敏感性。
                 *
                 * immediatelyReleaseResources:(取代UCanAccess 3.0.6版本以后被弃用的singleConnection):它用于ETL作业、计划
                 * 任务,或者在只打开一个连接的情况下“一次性”使用UCanAccess。所有资源(内存和文件系统)将在连接结束时释放。默认
                 * 设置为false。
                 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    正确的连接

    
     // 数据库驱动
     String DRIVER_CLASS = "net.ucanaccess.jdbc.UcanaccessDriver";
     // 数据库连接地址
     String DB_URL = "jdbc:ucanaccess://" + filePathMDB + ";memory=false;Skipindexes=true;ignorecase=true;immediatelyReleaseResources=true";
     String DB_USER = ""; // 数据库用户名称
     String DB_PASSWORD = "";// 数据库用户密码
     accessDriverHelper = new AccessDriverHelper(DRIVER_CLASS, DB_URL, DB_USER, DB_PASSWORD);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Angular 项目升级需要注意什么?
    《蛤蟆先生去看心里医生》阅读笔记
    英伟达Nvidia论坛
    【Games101】-> 计算机图形学
    Gin 自定义控制器
    Java Tomcat内存马——Listener内存马
    【信息融合】基于matlab BP神经网络和DS证据理论不确定性信息融合问题【含Matlab源码 2204期】
    详解GaussDB(DWS)中的行执行引擎
    STL常用容器——queue容器的使用
    Node.js身份核验接口、身份证二、三要素实名认证接口
  • 原文地址:https://blog.csdn.net/weixin_36582951/article/details/134027782