代码之家  ›  专栏  ›  技术社区  ›  Wizard

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

  •  2
  • Wizard  · 技术社区  · 9 年前

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

    我放置了一些时间戳,发现根本原因是以下方法,特别是第一个try-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 回复  |  直到 9 年前
        1
  •  3
  •   Gord Thompson    9 年前

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

    如果Access数据库在您启动Java应用程序期间不太可能经常更改,那么您可以使用UCanAccess keepMirror connection参数将镜像数据库持久化到本地硬盘上的文件夹中。这将减少应用程序启动时间,因为UCanAccess不必每次都重建镜像数据库。看见 the UCanAccess site 详细信息。

        2
  •  2
  •   Wizard    9 年前

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

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