Как правильно отключить определенный БД и закрыть соединение? - PullRequest
0 голосов
/ 11 ноября 2018

Я создал следующие три метода, но не понимаю, что на самом деле делает shutDownDB (). Вот мои вопросы:

  1. Зачем мне нужно активное соединение для отключения определенной базы данных?
  2. Разве не имеет смысла закрыть соединение и затем отключить БД
  3. Зачем мне закрывать соединение, если конкретная база данных закрыта?
  4. Почему я могу восстановить соединение после того, как определенная БД была закрыта?
  5. Какова фактическая разница между выключением определенной базы данных и закрытием соединения?

ПРИМЕЧАНИЕ: использование дерби во встроенном режиме

    public static Connection openDB(String dbFolderString) {
    Connection conn = null;
    try{ 
        File dbFolder = new File(dbFolderString);
        String URL = "jdbc:derby:" + dbFolderString + ";create=true"; 
        if(print)System.out.println("\n" + "db exists " + dbFolder.exists());

        conn = DriverManager.getConnection(URL);            
        if(print)System.out.println("Succesfully connected to " + dbFolderString);            
    }catch(SQLException e){
        System.out.println("FATAL ERROR: from getDB " + e);
        System.exit(0);            
    } 
    return conn;
    }   

    public static boolean shutDownDB(Connection conn) { 
    //shutsdown a specific database but DOES NOT SHUTDOWN DERBY
    try{
        String[] tokens;
        String url = conn.getMetaData().getURL(); 
        tokens = url.split(":");
        DriverManager.getConnection("jdbc:derby:" + tokens[2] +";shutdown=true");                      
    }catch(SQLException e1){
        if(e1.getSQLState().equals("08006") && e1.getErrorCode() == 45000){
            if(false)System.out.println(e1.getSQLState() + "  " + e1.getErrorCode());
            if(print)System.out.println("\n" + "Database shutdown successful"); 
        }else{
            System.out.println(e1.getSQLState() + "  " + e1.getErrorCode());
            System.out.println("FATAL ERROR: Database not shutdown  " + e1);
            System.exit(0);
        }
    }
    return true;
    }    

    public static void closeConnection(Connection conn){
    try{ 
        conn.close();
        if(print)System.out.println("Connection closed");
    }catch(SQLException e){            
        System.out.println("connection NOT closed " + e);
        System.exit(0);
    }        
    }

1 Ответ

0 голосов
/ 11 ноября 2018

Начнем с того, что в документации Derby сказано:

Завершение работы Derby или отдельной базы данных

Приложения во встроенной среде закрывают систему Derby указание атрибута shutdown = true в URL-адресе соединения. Закрыть вниз по системе, вы не указываете имя базы данных, и вы не обычно указывается любой другой атрибут.

jdbc:derby:;shutdown=true

Успешное завершение всегда приводит к исключению SQLEx что Дерби закрылся и что нет другого исключения.

Если вы включили аутентификацию пользователя на системном уровне, вы необходимо указать учетные данные (то есть имя пользователя и пароль) в порядке завершить работу системы Derby, а также предоставленные имя пользователя и пароль также должен быть определен на системном уровне.

и т. Д.


Ваши вопросы:

1) Зачем мне нужно активное соединение для отключения определенной базы данных?

  • Потому что так сказано в документации.

  • Потому что именно так они это реализовали.

  • Поскольку для закрытия базы данных (в общем случае) требуется пользователь аутентификация и установление соединения - это место, где пользователь аутентификация происходит.

2) Разве не имеет смысла закрыть соединение и затем отключить БД?

Учитывая последнее, нет.

3) Зачем мне закрывать соединение, если конкретная база данных закрыта?

Вам не нужно , если ваше приложение может справиться с потенциальной утечкой ресурсов; например сокеты, которые не могли быть закрыты на стороне клиента.

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

4) Почему я могу восстановить соединение после отключения определенной базы данных?

Предположительно, потому что он предназначен для этого.

5) Какова фактическая разница между выключением определенной базы данных и закрытием соединения?

(я не совсем уверен в этом ....)

Завершение работы базы данных сделает недействительными все соединения для конкретной базы данных. Он не закрывает их на стороне клиента, поэтому сокеты могут оставаться открытыми ... до тех пор, пока часть вашего приложения, использующая соответствующие коллекции, не попытается использовать их, не обнаружит, что они "мертвы", и не закроет их.

Напротив, закрытие соединения закрывает просто это соединение как на стороне сервера, так и на стороне клиента. Любые розетки должны быть немедленно закрыты.


ПРИМЕЧАНИЕ: использование дерби во встроенном режиме

Документация не делает различий для встроенного и не встроенного режима.

...