2010-02-21 12 views
15

Ich benutze Derby als eine eingebettete Datenbank. Außerdem verwende ich die In-Memory-Datenbankoption für meine Komponententests.Herunterfahren der Derby In-Memory-Datenbank Richtig

Was ich nicht herausfinden kann ist, wie man die Derby-Datenbank (A quick look at the code) richtig heruntergefahren. Ich glaube, ich habe es funktioniert für eine Standard-Datenbank, aber ich bekomme verschiedene Ausnahmen, wenn Sie ähnliche Code auf einer In-Memory-Datenbank versuchen.

Ich werde Details weglassen, ich werde sie hinzufügen, wenn andere Gefühl benötigt werden.

Grundsätzlich versuche ich meine Datenbank in diesen beiden Moden herunterzufahren, wo meine In-Memory-Datenbank konsistent "eh" genannt wird:

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

dann:

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

der ehemaligen Ergebnisse in an exception but not the one expected. Die Details sind:

java.sql.SQLNonTransientConnectionException: Datenbank 'Speicher: eh' Shutdown.

Letzteres führt zu

java.sql.SQLException: Datenbank 'eh' nicht gefunden.

Basierend auf dem, was ich herausgefunden habe, wollen wir eine SQLException, aber nicht die, die wir erhalten. Auf der anderen Seite scheint der SQLNonTransientConnectionException Fehler angemessener, aber ist nicht der richtige Typ (obwohl es von SQLException abgeleitet ist), noch hat es den richtigen Statuscode. Der staatliche Code lautet: 08006.

Der Beispielcode, den ich habe, veranschaulicht, dass ein SQLException mit einem SQL-Status von "XJ015".

Hinweis: Das Beispiel, das ich verweise, ist: WwdEmbedded Program (Java Code).

+0

Verwenden Sie Drop statt Herunterfahren scheint, was Sie wollen. Herunterfahren scheint die Datenbank nicht zu löschen. – BrunoJCM

Antwort

20

XJ015 (mit SQLCODE 50000) ist die erwartete (erfolgreiche) SQLSTATE für das vollständige Herunterfahren des Systems. 08006 (mit SQLCODE 45000), auf der anderen Seite ist die erwartete SQLSTATE für das Herunterfahren nur einer einzelnen Datenbank.

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

Fährt das gesamte System nach unten und in XJ015 führen soll.

0

Ich glaube, dass Ihr erstes Codebeispiel in Ordnung ist. Der SQL-Statusunterschied, den Sie sehen, liegt vermutlich daran, dass Derby eingebettet ist, aber der Beispielcode, den Sie gesehen haben (mit dem SQL-Status XJ015), in einer Client-Server-Konfiguration ausgeführt wurde.

Wie Sie festgestellt haben, ist die SQLNonTransientConnectionException eine Unterklasse von SQLException. Daher bin ich verwirrt, warum Sie glauben, dass Sie nicht den richtigen Ausnahmetyp erhalten.

+0

Vielen Dank für Ihre Antwort. Ich kam schließlich zu dem gleichen Schluss wie Sie, habe aber immer noch keine Beweise, dass es richtig ist, abgesehen von Ihrer Zustimmung. Ich habe sogar versucht, die Derby Source zu suchen. Das Beispiel, das ich verweise, ist das WwdEmbedded.java, das ein eingebettetes Beispiel ist. Außerdem gibt die Dokumentation an, dass eine SQLException erwartet wird ... Nicht SQLException oder ein Nachkomme. Allerdings akzeptiere ich das als eine mögliche Idee, weshalb ich die Beziehung an erster Stelle erwähnt habe. –

12

Die URL "jdbc: derby: speicher: eh; shutdown = true" führt zu dem erwarteten Fehlercode 08006, entfernt jedoch nicht die DB aus dem Speicher.Wenn Sie später versuchen, eine neue Datenbank mit "jdbc: derby: memory: eh; create = true" zu erstellen, erhalten Sie eine Fehlermeldung, dass die Datenbank bereits existiert.

Glücklicherweise ist es ab Derby 10.6.1.0 (veröffentlicht am 17. Mai 2010) möglich, eine In-Memory-Datenbank mit einer URL der Form "jdbc: derby: memory: eh; drop = true" zu löschen ". Siehe die release notes und die Seite Using in-memory databases.