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

时间:2015-08-13 14:58:49

标签: java ms-access jdbc javafx ucanaccess

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

我放了一些时间戳,发现根本原因是下面的方法,特别是第一次尝试catch块需要25秒才能执行。在那之后,每隔一次我调用这个方法,一切都在一秒钟之内运行。关于如何解决这个问题的任何建议?

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();
    }

}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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