2010-02-21 17 views
15

Estoy usando derby como una base de datos incrustada. Además, estoy usando su opción de base de datos en memoria para mis pruebas unitarias.Cómo cerrar la base de datos en memoria de Derby Correctamente

Lo que no puedo entender es cómo cerrar correctamente (A quick look at the code) la base de datos Derby. Creo que lo tengo trabajando para una base de datos estándar, pero obtengo excepciones diferentes cuando intento un código similar en una base de datos en memoria.

Voy a omitir los detalles, los agregaré si se necesitan otros sentimientos.

Básicamente, estoy tratando de cerrar mi base de datos en estos dos modas en mi base de datos en memoria se llama constantemente "eh":

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

a continuación:

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

El primero resultados en an exception but not the one expected. Los detalles son:

java.sql.SQLNonTransientConnectionException: Base de datos 'memoria: eh' apagado.

Los últimos resultados en

java.sql.SQLException: Base de datos 'eh' no encontrados.

Según lo que he podido averiguar, queremos un SQLException pero no el que recibimos. Por otro lado, el error SQLNonTransientConnectionException parece más apropiado, pero no es el tipo correcto (aunque se deriva de SQLException) ni tiene el código de estado correcto. El código de estado termina siendo: 08006.

El código de ejemplo que tengo ilustra que un SQLException con un estado SQL de "XJ015".

Nota: El ejemplo al que me refiero es: WwdEmbedded Program (Java Code).

+0

Parece que usar drop en lugar de shutdown es lo que quieres. el cierre parece no soltar la base de datos. – BrunoJCM

Respuesta

20

XJ015 (con SQLCODE 50000) es el esperado (correcto) SQLSTATE para el apagado completo del sistema. 08006 (con SQLCODE 45000), por otro lado, es el esperado SQLSTATE para el cierre de solo una base de datos individual.

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

Apaga todo el sistema y debería resultar en XJ015.

0

Creo que su primer ejemplo de código está bien. La diferencia de SQL State que está viendo, creo, se debe a que está ejecutando Derby embedded, pero el código de ejemplo que vio (con el estado de SQL XJ015) se estaba ejecutando en una configuración de cliente-servidor.

Como mencionó, SQLNonTransientConnectionException es una subclase de SQLException, por lo que no estoy seguro de por qué cree que no está obteniendo el tipo correcto de excepción.

+0

Gracias por su respuesta. Finalmente llegué a la misma conclusión que usted pero aún no tengo pruebas de que sea correcto, aparte de su acuerdo. Incluso intenté buscar en Derby Source. El ejemplo al que me refiero es el WwdEmbedded.java, que es un ejemplo incrustado. Además, la Documentación indica que se espera una SQLException ... No SQLException o un descendiente. Dicho esto, acepto esto como una idea posible y por eso mencioné la relación en primer lugar. –

12

La URL "jdbc: derby: memory: eh; shutdown = true" da como resultado el código de error 08006 esperado, pero en realidad no elimina la base de datos de la memoria.Si más tarde intentas crear una nueva base de datos con "jdbc: derby: memory: eh; create = true", obtendrás un error que dice que la base de datos ya existe.

Afortunadamente, a partir de Derby 10.6.1.0 (lanzado el 17 de mayo de 2010), es posible realmente soltar una base de datos en memoria utilizando una URL de la forma "jdbc: derby: memory: eh; drop = true ". Consulte el release notes y la página Using in-memory databases.

Cuestiones relacionadas