Я использую дерби в качестве встроенной базы данных. Кроме того, я использую, это - параметр базы данных в оперативной памяти для моих модульных тестов.
То, что я не могу выяснить, - то, как правильно закрыть (Беглый взгляд на код) базу данных Derby. Я полагаю, что у меня есть он работающий на стандартную базу данных, но я получаю различные исключения когда попытка подобный код базы данных в оперативной памяти.
Я собираюсь опустить детали, я добавлю их, если другое чувство будет необходимо.
В основном я пытаюсь закрыть свою базу данных этими двумя способами, где мою базу данных в оперативной памяти последовательно называют "а":
DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");
затем:
DriverManager.getConnection("jdbc:derby:eh;shutdown=true");
Бывшие результаты в исключении, но не том ожидаются. Детали:
java.sql. SQLNonTransientConnectionException: База данных 'memory:eh' завершение работы.
Последние результаты в
java.sql. SQLException: База данных, 'а' не найденная.
На основе того, что я смог выяснить, мы хотим a SQLException
но не тот мы получаем. С другой стороны, SQLNonTransientConnectionException
ошибка кажется более соответствующей, но не является правильным типом (хотя это получено из SQLException
) и при этом это не имеет правильного кода состояния. Код состояния заканчивает тем, что был: 08006
.
Пример кода, который я имею, иллюстрирует это a SQLException
с состоянием SQL "XJ015".
Примечание: Пример, на который я ссылаюсь: Программа WwdEmbedded (Код Java).
XJ015 (с SQLCODE
50000) является ожидаемым (успешным) SQLSTATE
для полного завершения работы системы. 08006 (с SQLCODE
45000), с другой стороны, является ожидаемым SQLSTATE
для завершения работы только отдельной базы данных.
DriverManager.getConnection("jdbc:derby:;shutdown=true");
Завершает работу всей системы и должен привести к XJ015
.
Я считаю, что ваш первый пример кода подходит. Я полагаю, что разница в состоянии SQL, которую вы видите, заключается в том, что вы используете встроенный Derby, но пример кода, который вы видели (с состоянием SQL XJ015), выполнялся в конфигурации клиент-сервер.
Как вы заметили, SQLNonTransientConnectionException является подклассом SQLException, поэтому я не понимаю, почему вы думаете, что получаете неправильный тип исключения.
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". См. release notes и страницу Using in-memory databases.