Медленное начальное подключение к базе данных MS Access

Я использую 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();
    }

}

person Wizard    schedule 13.08.2015    source источник
comment
Не могли бы вы уточнить: вы говорите, что Class.forName(...) занимает 25 секунд?   -  person James_D    schedule 13.08.2015
comment
@James_D Правильно, эта строка кода занимает 25 секунд. Два других блока try catch длятся секунду.   -  person Wizard    schedule 13.08.2015
comment
Попробуйте полностью исключить блок Class.forName(). Часто это не требуется, если вы не используете довольно старый JDK.   -  person Gord Thompson    schedule 13.08.2015
comment
Я использую JDK 1.8. Я пропустил блок, и происходит то же самое.   -  person Wizard    schedule 13.08.2015
comment
Я добавил метку времени в начале второго блока и после метода this.connection = DriverManager.getConnection(). Результаты с меткой времени приведены ниже {SysUpTime = 0:0:0} {Timestamp = Thu 13 Aug 18:07:23 CEST 2015} {SysUpTime = 0:0:0} {Timestamp = Thu 13 Aug 18:07:40 CEST 2015}   -  person Wizard    schedule 13.08.2015


Ответы (2)


UCanAccess использует «зеркальную базу данных» HSQLDB, которая по умолчанию хранится в памяти и должна быть воссоздана, когда приложение открывает базу данных Access. Это включает в себя копирование данных из таблиц Access в таблицы HSQLDB, что может занять некоторое время, если база данных Access большая. Наличие базы данных Access в общем сетевом ресурсе еще больше замедлит этот процесс.

Если маловероятно, что база данных Access будет изменяться очень часто между запуском приложения Java, вы можете использовать параметр соединения UCanAccess keepMirror, чтобы сохранить зеркальную базу данных в папке на локальном жестком диске. Это сократит время запуска вашего приложения, поскольку UCanAccess не придется каждый раз перестраивать зеркальную базу данных. Подробнее см. на сайте UCanAccess.

person Gord Thompson    schedule 14.08.2015
comment
Спасибо Горд еще раз. Это сократило время соединения с 25 до 4 секунд. - person Wizard; 20.08.2015

Поэтому я отвечаю на свой вопрос через некоторое время в надежде, что это будет кому-то полезно. Несмотря на то, что приведенный выше ответ Горда работает нормально, я бы сказал, что он больше подходит для больших баз данных (см. сайт UCanAccess), и у меня возникли проблемы, когда несколько пользователей пытались подключиться к базе данных, например. возникла проблема с локально сохраненными файлами.

Основной причиной моей проблемы было расположение папки на общем диске/сервере, а соединение было медленным, поскольку серверная часть базы данных хранилась в шестой подпапке от корневого каталога. Это связано с безопасностью сервера, потому что сервер (только в первый раз) выполняет проверку для каждой папки, через которую он должен пройти. Когда я переместил свою папку в корневой каталог, подключение заняло около 2 секунд.

person Wizard    schedule 31.01.2016