Java DB (он же Derby) не восстанавливает базу данных из резервной копии

Как я прочитал из руководств по Apache, я попытался восстановить мою встроенную базу данных Java DB (AKA Derby), используя этот код:

private void restoreBackup() {
    FileDialog fileDialog = new FileDialog(new Frame(), "Choose A Backup Folder)", FileDialog.LOAD);
    //fileDialog.setDirectory("::myVolume:");
    fileDialog.setVisible(true);
    String fileName = fileDialog.getDirectory();

    if (fileDialog.getDirectory() != null) {
        fileName = fileName.substring(0, fileName.lastIndexOf(System.getProperty("file.separator")));
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
            Properties connectionProps = new Properties();
            connectionProps.put("restoreFrom", fileName);
            connectionProps.put("user", "pass");
            connectionProps.put("password", "databaseName");
            conn = DriverManager.getConnection(dbURL, connectionProps);
            conn.commit();
            System.out.println("Database Restored");
        } catch (InstantiationException ex) {
            Logger.getLogger(ReseachAssistantUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(ReseachAssistantUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ReseachAssistantUI.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ReseachAssistantUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Но ничего не происходит, хотя исключений не возникает. Я делаю что-то не так здесь?


person Igor    schedule 12.03.2013    source источник
comment
Можете ли вы попробовать использовать полный путь вместо имени файла? Получаете ли вы имя файла и путь в формате, указанном в опубликованном вами руководстве по Apache?   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha Я только что сделал, и все по-прежнему. Это имя файла, которое я получаю "C:\Users\Igor\Desktop\BackUpData2013-03-12@01-22-19\Research Assistant Data V0.26", которое на самом деле является папкой.   -  person Igor    schedule 12.03.2013
comment
Хм... Я снова просмотрел руководство, и там сказано: "...URL-адрес подключения должен быть следующим: jdbc:derby:toursDB;createFrom=c:\mybackups\sample". Можете ли вы изменить свой dbURL на выглядеть как выше? Конечно, это будет restoreFrom, а не createFrom.   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha Извините, я не вижу, что нужно изменить. Что отличается в вашем примере? Вот вся строка: jdbc:derby:Research Assistant Data V0.26;restoreFrom=C:\Users\Igor\Desktop\BackUpData2013-03-12@01-22-19\Research Assistant Data V0.26   -  person Igor    schedule 12.03.2013
comment
Что произойдет, если вы попробуете ту же команду в инструменте ij? Запустите IJ, а затем «подключите jdbc:derby:dbname;restoreFrom=backupName»;   -  person Bryan Pendleton    schedule 12.03.2013
comment
@BryanPendleton К сожалению, я не знаком с ij.   -  person Igor    schedule 12.03.2013
comment
У вас есть доступ к командной строке для базы данных? Через инструмент может быть? Куда бы вы запускали запросы? напр. если бы вам нужно было сделать select * from emp, где бы вы запустили этот оператор? Вы можете перейти к этому экрану и выполнить команду, которую говорит Брайан. В качестве альтернативы, можете ли вы обновить свой код до getConnection(String DBurl)? и убедитесь, что URL-адрес имеет формат, в котором указано руководство Apache.   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha Я использую SQuirrel и встроенную службу базы данных в NetBean. Я могу выполнить этот оператор, он показывает ошибку.   -  person Igor    schedule 12.03.2013
comment
Я также отредактировал свой комментарий, включив в него другой метод getConnection, попробуйте и его.   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha Я тоже так делал, никакого эффекта.   -  person Igor    schedule 12.03.2013
comment
Это неправильное решение, но я могу просто удалить папку базы данных и скопировать ее из резервного каталога.   -  person Igor    schedule 12.03.2013
comment
›выдает ошибку. Какую ошибку показывает? Кроме того, вы пытались поставить точки отладки и проверить каждую строку кода?   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha Синтаксическая ошибка SQL. Я не могу выполнить этот оператор «подключения» или не знаю его SQL-эквивалента.   -  person Igor    schedule 12.03.2013
comment
Несколько вещей: 1) У вас вообще есть база данных? В документе говорится, что он удалит существующую базу данных и создаст новую. 2) У вас есть права администратора для этой операции? 3) вы можете переименовать файл резервной копии и попробовать?   -  person happybuddha    schedule 12.03.2013
comment
Вот еще документация из одного из предыдущих постов Брайана: db.apache.org/derby/docs /10.9/начало работы   -  person happybuddha    schedule 12.03.2013
comment
@happybuddha У меня есть действующая база данных, и у меня есть права администратора на удаление и копирование. Я не могу переименовать файл резервной копии, потому что это переименовало бы имя базы данных. Резервная копия на самом деле является копией папки базы данных, а не файла. Кроме того, указанный вами сайт не меняет URL-адрес при переходе по ссылкам, поэтому ваша ссылка открывает корневую страницу. Я ценю, что вы пытаетесь. Я хотел бы, чтобы это работало, но поскольку резервная копия представляет собой папку, я создал метод, который копирует эту папку и заменяет ею текущую папку базы данных.   -  person Igor    schedule 13.03.2013


Ответы (1)


У меня была та же проблема, и я решил ее, сначала отключив базу данных, а затем восстановив ее. Например:

        String nsURL1 = "jdbc:derby:*PATH*;shutdown=true";
        String nsURL2 = "jdbc:derby:*PATH*;restoreFrom="+ fileName;
        connectionProps.setProperty("user", "pass");
        connectionProps.setProperty("password", "databaseName");

        DriverManager.getConnection(nsURL1, props);
        dbConnection = DriverManager.getConnection(nsURL2, props);

и используя try-catch

person Pap Kostis    schedule 28.08.2013
comment
Работает на меня. Но внимание: Если резервное копирование было сделано с помощью процедуры CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('BACKUPPATH'), то восстановление должно быть с restoreFrom=BACKUPPATH/DATABASENAME. - person mr.wolle; 04.08.2014