与 MS 访问数据库的初始连接缓慢

Slow initial connection to MS access database

我正在使用 UCanAccess 将我的 JavaFX 应用程序与共享驱动器上的数据库连接起来。我第一次打开应用程序和 运行 一些查询时,与数据库的初始连接大约需要 25 秒。

我放了一些时间戳,发现根本原因是下面的方法,特别是第一个 try catch 块需要 25 秒才能执行。在那之后,每隔一段时间我都会在瞬间调用此方法 运行s。关于如何解决这个问题有什么建议吗?

public void openDB(){

    // Load MS access driver class


    try {
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("There was an error while connecting to the database");
        e.printStackTrace();
    }


    String databasePath ="jdbc:ucanaccess:////server\MyDB.accdb";


    try {
        this.connection = DriverManager.getConnection(databasePath, "", "");
        this.connection.setAutoCommit(false);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        this.statement = connection.createStatement();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

UCanAccess 使用 HSQLDB "mirror database",默认情况下它存储在内存中,并且必须在应用程序打开 Access 数据库时重新创建。这涉及将数据从 Access 表复制到 HSQLDB 表,如果 Access 数据库很大,这可能需要一些时间。将 Access 数据库放在网络共享上会进一步减慢该过程。

如果 Access 数据库不太可能在您启动 Java 应用程序期间频繁更改,那么您可以使用 UCanAccess keepMirror 连接参数将镜像数据库保存在您本地的硬盘驱动器。这将减少您的应用程序启动时间,因为 UCanAccess 不必每次都重建镜像数据库。有关详细信息,请参阅 the UCanAccess site

所以我会在一段时间后回答我的问题,希望这对某些人有用。 尽管 Gord 的上述回答工作正常,但我会说这更适合较大的数据库(请参阅 UCanAccess 站点)并且当多个用户尝试连接到数据库时我遇到了问题,例如本地存储的文件有问题。

我的问题的根本原因是共享 drive/server 上的文件夹位置并且连接很慢,因为数据库后端存储在根目录的第六个子文件夹中。这与服务器安全性有关,因为服务器(仅第一次)对其必须经过的每个文件夹执行检查。当我将我的文件夹移动到根目录时,连接大约需要 2 秒。