Как закрыть базу данных 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, поэтому я смущен тем, почему вы думаете, что не получаете правильный тип исключения.