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