Как закрыть базу данных Derby в памяти

Я использую дерби как встроенную базу данных. Кроме того, я использую эту опцию базы данных в памяти для своих модульных тестов.

Я не могу понять, как правильно закрыть (быстрый просмотр кода) в базе данных Derby. Я верю, что я работаю над стандартной базой данных, но у меня возникают разные исключения, когда вы пытаетесь использовать аналогичный код в базе данных в памяти.

Я собираюсь пропустить детали, я добавлю их, если вам понадобятся другие ощущения.

В принципе, я пытаюсь закрыть мою базу данных в этих двух моделях, где моя база данных в памяти последовательно называется "eh":

DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

то

DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

Первое приводит к исключению, но не ожидаемому. Подробности:

java.sql.SQLNonTransientConnectionException: выгрузка базы данных: eh.

Последнее приводит к

java.sql.SQLException: база данных 'eh' не найдена.

Основываясь на том, что мне удалось выяснить, нам нужен SQLException, но не тот, который мы получаем. С другой стороны, ошибка SQLNonTransientConnectionException кажется более подходящей, но не является правильным типом (хотя она получена из SQLException) и не имеет правильного кода состояния. Код состояния заканчивается: 08006.

В приведенном ниже примере кода показано, что a SQLException с SQL-состоянием "XJ015".

Примечание. Пример, на который я ссылаюсь: WwdEmbedded Program (Java-код).

Ответы

Ответ 1

XJ015 (с SQLCODE 50000) является ожидаемым (успешным) SQLSTATE для полного выключения системы. 08006 (с SQLCODE 45000), с другой стороны, является ожидаемым SQLSTATE для выключения только отдельной базы данных.

DriverManager.getConnection("jdbc:derby:;shutdown=true");

Закрывает всю систему и приводит к XJ015.

Ответ 2

URL-адрес "jdbc: derby: memory: eh; shutdown = true" приводит к ожидаемому коду ошибки 08006, но фактически не удаляет БД из памяти. Если позже вы попытаетесь создать новую базу данных с помощью "jdbc: derby: memory: eh; create = true", вы получите сообщение об ошибке, заявив, что база данных уже существует.

К счастью, по состоянию на Derby 10.6.1.0 (выпущен 17 мая 2010 г.) можно фактически удалить базу данных в памяти, используя URL-адрес формы "jdbc: derby: memory: eh; drop = true", См. примечания к выпуску и страница Использование баз данных в памяти.

Ответ 3

Я считаю, что ваш первый пример кода прекрасен. Я считаю, что разница в состоянии SQL, которую вы видите, связана с тем, что вы запустили Derby, но код примера, который вы видели (с состоянием SQL XJ015), выполнялся в конфигурации клиент-сервер.

Как вы отметили, SQLNonTransientConnectionException является подклассом SQLException, поэтому я смущен тем, почему вы думаете, что не получаете правильный тип исключения.