2015-08-13 3 views
2

Я использую UCanAccess для подключения моего приложения JavaFX к базе данных на общем диске. В первый раз, когда я открываю приложение и запускаю некоторый запрос, начальное подключение к базе данных занимает около 25 секунд.Медленное начальное подключение к базе данных доступа MS

Я установил некоторые временные метки и обнаружил, что основная причина - это метод ниже, в частности, первый блок catch try занимает 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(); 
    } 

} 
+0

Можете ли вы пояснить: вы говорите: 'Class.forName (...)' занимает 25 секунд? –

+0

@James_D Правильно, эта строка кода занимает 25 секунд. Остальные две попытки поймать блоки последние секунды. – Wizard

+0

Попробуйте полностью исключить блок 'Class.forName()'. Это часто не требуется, если вы не используете довольно старый JDK. –

ответ

2

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

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

+0

Спасибо, Горд еще раз. Это сократит время соединения с 25 до 4 секунд. – Wizard

2

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

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

Смежные вопросы