2010-02-21 12 views
15

Używam derby jako wbudowanej bazy danych. Ponadto używam opcji bazy danych w pamięci do testów jednostkowych.Jak zamknąć bazę danych Derby w pamięci Właściwie

Czego nie mogę się dowiedzieć, to jak poprawnie wyłączyć bazę danych Derby (A quick look at the code). Sądzę, że działa to w przypadku standardowej bazy danych, ale uzyskuję różne wyjątki podczas próby podobnego kodu w bazie danych w pamięci.

Zamierzam pominąć szczegóły, dodam je, jeśli inne odczucia są potrzebne.

Zasadniczo próbuję zamknąć mojej bazy danych w tych dwóch mód gdzie moja baza danych w pamięci jest konsekwentnie nazywany „eh”:

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

następnie:

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

Były wyniki w an exception but not the one expected. Szczegóły są następujące:

java.sql.SQLNonTransientConnectionException: Baza danych "pamięć: eh" wyłączenie.

Te ostatnie wyniki w

java.sql.SQLException: Baza 'eh' nie została znaleziona.

Na podstawie tego, co udało mi się wymyślić, chcemy uzyskać SQLException, ale nie tę, którą otrzymujemy. Z drugiej strony błąd SQLNonTransientConnectionException wydaje się bardziej odpowiedni, ale nie jest prawidłowym typem (chociaż pochodzi z SQLException) i nie ma właściwego kodu stanu. Kod stanu kończy się: 08006.

Przykładowy kod I ilustruje, że SQLException ze stanem SQL "XJ015".

Uwaga: Podany przykład to: WwdEmbedded Program (Java Code).

+0

Używanie drop zamiast shutdown wydaje się być tym czego potrzebujesz. shutdown wydaje się nie opuszczać bazy danych. – BrunoJCM

Odpowiedz

20

XJ015 (z SQLCODE 50000) jest oczekiwanym (udanym) SQLSTATE do całkowitego zamknięcia systemu. 08006 (z SQLCODE 45000), z drugiej strony, jest oczekiwana SQLSTATE do wyłączania tylko pojedynczej bazy danych.

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

Wyłącza cały system i powinien skutkować XJ015.

0

Wierzę, że twój pierwszy przykład kodu jest w porządku. Uważa się, że różnica w stanie SQL, którą widzisz, polega na tym, że używasz programu Derby wbudowanego, ale przykładowy kod, który zobaczyłeś (z stanem SQL XJ015) działał w konfiguracji klient-serwer.

Jak zauważyłeś, wyjątek SQLNonTransientConnectionException jest podklasą wyjątku SQLException, więc nie rozumiem, dlaczego uważasz, że nie masz odpowiedniego typu wyjątku.

+0

Dziękuję za odpowiedź. W końcu doszedłem do tego samego wniosku co ty, ale nadal nie masz dowodów, że to prawda, poza twoim porozumieniem. Próbowałem nawet przeszukać źródło Derby. Przykład, do którego się odwołuję, to WwdEmbedded.java, który jest osadzonym przykładem. Ponadto Dokumentacja wskazuje na oczekiwanie wyjątku SQLException ... Nie SQLException lub potomka. To powiedziawszy, akceptuję to jako możliwy pomysł, dlatego przede wszystkim wspomniałem o związku. –

12

Adres URL "jdbc: derby: memory: eh; shutdown = true" powoduje oczekiwany kod błędu 08006, ale w rzeczywistości nie usuwa DB z pamięci.Jeśli później spróbujesz utworzyć nową bazę danych z "jdbc: derby: memory: eh; create = true", pojawi się komunikat o tym, że baza danych już istnieje.

Na szczęście, tak jak w Derby 10.6.1.0 (wydany 17 maja 2010), możliwe jest opuszczenie bazy danych w pamięci przy użyciu adresu URL formularza "jdbc: derby: memory: eh; drop = true ". Zobacz release notes i stronę Using in-memory databases.

Powiązane problemy