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

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

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

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

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

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,

Пример кода, который я имею, иллюстрирует, что SQLException с состоянием SQL "XJ015".

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

3 ответа

Решение

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

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

Отключает всю систему и должно привести к XJ015,

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". См. Заметки о выпуске и страницу Использование баз данных в памяти.

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

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

Другие вопросы по тегам