Как правильно отключить базу данных Derby в памяти - PullRequest
15 голосов
/ 22 февраля 2010

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

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

20 голосов
/ 07 апреля 2010

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

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

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

12 голосов
/ 16 августа 2010

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

0 голосов
/ 26 февраля 2010

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

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

...