base de datos derby embebida no se cierra hasta finalizar toda la aplicación

Hola javamexico.org

Me sucede lo del título. Yo siempre que hago una consulta a la base de datos luego de recibir los resultados le indico que la cierre de la siguiente forma:::

public void cerrarConexion()
        {
               
               
                try {
            instruccion.close();
            conexion.close();
           
           
           
           
           
            instruccion = null;
            conexion = null;
         }
         
         
         catch ( SQLException excepcionSql ) {
            JOptionPane.showMessageDialog( null,
               excepcionSql.getMessage(), "Error en base de datos",
               JOptionPane.ERROR_MESSAGE );
         
           
         }
         catch( NullPointerException e )
         {
                       
         }
               
        }

pero si abro una consola y trato de conectarme a la base de datos me dice:::

zzzzz@linux-xzls:~/PERSONAL/Sistema Piel de luna/ver 0.2> java org.apache.derby.tools.ij
Versión ij 10.3
ij> connect 'jdbc:derby:lunaBD';
ERROR XJ040: No se ha podido iniciar la base de datos 'lunaBD', consulte la excepción siguiente para obtener detalles.
ERROR XSDB6: Es posible que otra instancia de Derby haya iniciado ya la base de datos /home/PERSONAL/Sistema Piel de luna/ver 0.2/lunaBD.
ij>

¿es normal esto en base de datos embebidas? me parece extraño, incluso le puse la instruccion System.clearProperty( "derby.system.home" ); antes de cerrar Connection y Statement pero igual::: si la aplicacion está corriendo no me deja acceder a la base de datos por consola.

Agradezco colaboración, un saludo.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Si, es completamente normal.

Si, es completamente normal.

Aunque hayas cerrado correctamente el driver sigue cargado en la JVM y no permite que se hagan modificaciones a la misma base de datos. Este diseño es por simplificación, al impedir que dos aplicaciones ( la tuya y el ij ) modifiquen la misma base de datos al mismo tiempo, Derby se asegura que no se corrompan los datos ( de una forma más fácil pues ).

No es la única forma, también se puede levantar la base de datos como un servidor y entonces puede haber más de dos clientes a la vez, y así podrías tener tu aplicación corriendo y poder consultar tus datos con el "ij" al mismo tiempo.

Levantarlo es muy fácil y el url del jdbc cambia un poco. En este momento no recuerdo exactamente cual es el comando exacto, pero esta en la documentación y te toma 10 minutos encontrarla.

Chau!

Imagen de samz550a

gracias OscarRyz por sacarme

gracias OscarRyz por sacarme de la duda :D , entonces es normal que sea así, que bien, ya se me hacia demasiado extraño.

Tienes razón, hacer funcionar derby como un servicio en el sistema es sencillo pero para el fin de la aplicación que estoy haciendo no es necesario.

Un saludo, muchas gracias

Imagen de ezamudio

no cierras la base de datos

Estás cerrando la conexión a la base de datos, pero no cierras la base de datos como tal; si la arrancaste en forma embebida, aunque cierres la conexión, la instancia de Derby sigue corriendo en tu JVM, tendrías que buscar cómo indicarle a la instancia de Derby que se cierre porque ya no necesitas usarla.

Es correcto. Cuando cierras

Es correcto. Cuando cierras tu aplicación la base de datos se cierra también.

Si quieres cerrarla antes tienes que "obtener" una nueva conexion así:

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

Ese shutdown=true es el que apaga la base de datos.

Para más información:
http://db.apache.org/derby/docs/10.5/devguide/tdevdvlp20349.html

Imagen de samz550a

wow :-D

De vuelta mil gracias OscarRyz, será algo genial a incluir en mi código. Gracias por la aclaración @chochosmx

Saludos.

PD:: que bien! te encontré en twitter @oscarryz :D