2010-02-21 14 views
15

Utilizzo il derby come database incorporato. Inoltre, sto usando la sua opzione di database in memoria per i miei test di unità.Come arrestare il database Derby in memoria Correttamente

Quello che non riesco a capire è come spegnere correttamente (A quick look at the code) il database Derby. Credo che abbia funzionato per un database standard, ma sto ricevendo diverse eccezioni quando provo codice simile su un database in memoria.

Ho intenzione di omettere i dettagli, li aggiungerò se sono necessarie altre sensazioni.

In sostanza, sto cercando di chiudere il mio database in questi due modi in cui il mio database in memoria è costantemente chiamato "eh":

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

poi:

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

L'ex risultati in an exception but not the one expected. I dettagli sono:

java.sql.SQLNonTransientConnectionException: memoria del database: eh 'shutdown.

Gli ultimi risultati in

java.sql.SQLException: Database 'eh' non trovato.

Sulla base di quello che sono stato in grado di capire, vogliamo un SQLException ma non quello che riceviamo. D'altra parte, l'errore SQLNonTransientConnectionException sembra più appropriato ma non è il tipo giusto (sebbene sia derivato da SQLException) né abbia il codice di stato corretto. Il codice di stato finirà per essere: 08006.

Il codice di esempio che ho illustrato è un SQLException con uno stato SQL di "XJ015".

Nota: l'esempio di riferimento è: WwdEmbedded Program (Java Code).

+0

L'utilizzo della derivazione anziché dello spegnimento sembra ciò che si desidera. lo spegnimento sembra non far cadere il database. – BrunoJCM

risposta

20

XJ015 (con SQLCODE 50000) è il previsto (con esito positivo) SQLSTATE per l'arresto completo del sistema. 08006 (con SQLCODE 45000), d'altra parte, è il SQLSTATE previsto per l'arresto di un singolo database.

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

Chiude l'intero sistema e dovrebbe risultare in XJ015.

0

Credo che il primo esempio di codice sia valido. La differenza di stato SQL che stai vedendo, credo, è perché stai eseguendo Derby embedded, ma il codice di esempio che hai visto (con stato XJ015 SQL) era in esecuzione in una configurazione client-server.

Come notato, SQLNonTransientConnectionException è una sottoclasse di SQLException, quindi sono confuso sul motivo per cui pensi di non ottenere il giusto tipo di eccezione.

+0

Grazie per la risposta. Alla fine sono arrivato alla tua stessa conclusione ma non ho ancora prove che sia giusto, a parte il tuo accordo. Ho anche provato a cercare Derby Source. L'esempio di riferimento è WwdEmbedded.java che è un esempio incorporato. Inoltre, la Documentazione indica di aspettarsi una SQLException ... Non SQLException o un discendente. Detto questo, lo accetto come una possibile idea, motivo per cui ho menzionato la relazione in primo luogo. –

12

L'URL "jdbc: derby: memoria: eh; shutdown = true" restituisce il codice di errore previsto 08006, ma in realtà non rimuove il DB dalla memoria.Se in seguito, proverai a creare un nuovo database con "jdbc: derby: memoria: eh; create = true", riceverai un errore che dice che il database esiste già.

Fortunatamente, a partire da Derby 10.6.1.0 (rilasciato il 17 maggio 2010), è possibile rilasciare effettivamente un database in memoria utilizzando un URL del modulo "jdbc: derby: memoria: eh; drop = true ". Vedere lo release notes e la pagina Using in-memory databases.

Problemi correlati