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

StackOverflow https://stackoverflow.com/questions/2307788

Вопрос

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

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

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

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

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

затем:

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

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

java.sql.SQLNonTransientConnectionException:База данных «память: да» отключена.

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

java.sql.SQLИсключение:База данных «а» не найдена.

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top