vasilis
Estoy tratando de usar la base de datos H2 desde una aplicación Java.
Creé la base de datos y sus tablas a través de la consola H2 y luego trato de conectarme desde Java usando
Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");
Sin embargo recibo el siguiente error:
Excepción en el subproceso “principal” org.h2.jdbc.JdbcSQLException: la base de datos puede estar ya en uso: “Bloqueada por otro proceso”. Posibles soluciones: cierre todas las demás conexiones; usa el modo servidor [90020-161]
Traté de borrar el dbname.lock.db
pero se vuelve a crear automáticamente.
¿Cómo puedo desbloquear la base de datos para usarla desde mi programa Java?
H2 todavía se está ejecutando (lo puedo garantizar). Necesita usar una conexión TCP para múltiples usuarios como ->
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>
O
DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");
También significa que debe iniciar el servidor en modo TCP. Honestamente, es bastante sencillo en la documentación.
Fuerce la finalización del proceso (javaw.exe para Windows) y asegúrese de que cualquier aplicación que pueda haberlo iniciado esté cerrada. Tienes un bloqueo activo.
-
Una nota al margen: a menos que sea una aplicación realmente insular, realmente recomiendo usar el modo TCP/IP. Se soluciona este problema exacto cuando un usuario abre accidentalmente dos instancias.
– Daniel B. Chapman
16 de noviembre de 2011 a las 21:40
-
Gracias por su respuesta. Estaba tratando de usar el modo incrustado porque, según la documentación, es más rápido.
– Vasilis
16 de noviembre de 2011 a las 22:01
-
@Vasilis es mucho más rápido. Simplemente terminas con la situación en la que te encontraste fácilmente. Puede considerar un marco en el que inicie la base de datos y la detenga con gracia desde dentro de la aplicación, evitando así la situación en la que se encuentra. Buena suerte, es una gran base de datos para pequeños conjuntos de datos.
– Daniel B. Chapman
16 de noviembre de 2011 a las 22:07
-
Con el H2 actual, el ejemplo anterior de DriverManager produce la excepción
A file path that is implicitly relative to the current working directory is not allowed in the database URL
. En cambio, si reemplazaserver~
con~
Parece que funciona bien.– Máx.
19 de noviembre de 2017 a las 20:14
Yo tuve el mismo problema. en Intellj, cuando quiero usar h2 base de datos cuando mi programa se estaba ejecutando, recibí el mismo error. Para resolver este problema, cambié la URL de conexión de
spring.datasource.url=jdbc:h2:file:~/ipinbarbot
a:
spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
Y entonces mi problema desapareció. ahora puedo conectarme a la base de datos “ipinbarbot” cuando mi programa está. Si usa Hibernate, tampoco olvide tener:
spring.jpa.hibernate.ddl-auto = update
buena suerte
-
Gracias, Saman, me ayudó… He escrito mi caso de uso también aquí.
– vimal krishna
12 mayo 2018 a las 18:12
cal vin
Estoy usando h2db con una aplicación de prueba T24 tafj, tuve el mismo problema pero logré resolverlo identificando la aplicación que ejecuta h2 (iniciada cuando intenté configurar una conexión de base de datos).
ps aux|grep java
dará salida como:
sysadmin 22755 3.2 0.1 5189724 64008 pts/3 Sl 08:28 0:00 /usr/java/default/bin/java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data
ahora mata esto con su ID de proceso:
kill -9 22755
y por último eliminar el archivo de bloqueo:
rm -f dbname.lock.db
-
Funcionó perfectamente. Pero no tuve que eliminar el archivo bloqueado. Simplemente matar el proceso funcionó.
– Nayantara Jeyaraj
21 de noviembre de 2018 a las 12:21
krishna vimal
Tengo una pista de Saman Salehi arriba. Mi caso de uso: preparación de la aplicación REST para el equilibrio de carga del lado del cliente (ejecutando dos instancias JVM de REST). Aquí mi aplicación MVC llamará a esta aplicación REST que tiene un servidor ActiveMQ para DATOS. Tuve el problema cuando ejecuté dos instancias de la aplicación REST en eclipse e intenté ejecutar ambas instancias al mismo tiempo con la siguiente configuración
spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update
Después de agregar DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
Ambas instancias se están ejecutando y se muestran en el panel de control de Eureka.
No cierre la base de datos cuando salga la VM: jdbc:h2:;DB_CLOSE_ON_EXIT=FALSE
Múltiples procesos pueden acceder a la misma base de datos sin tener que iniciar el servidor manualmente ;AUTO_SERVER=TRUE
Otras lecturas:
http://www.h2database.com/html/features.html
También puede visitar la pestaña “Preferencias” desde H2 Console y cerrar todas las sesiones activas presionando el botón de apagado.
-
Esto es correcto. La respuesta simple es cerrar sesión en la base de datos y apagar el servidor. Consulte Desconectar y detener la aplicación en el tutorial de H2.
–Andrew Cowenhoven
29 de junio de 2015 a las 15:06
Sivakrishna
Paso simple: vaya al administrador de tareas y elimine el proceso de Java
luego comience su aplicación
-
Esto es correcto. La respuesta simple es cerrar sesión en la base de datos y apagar el servidor. Consulte Desconectar y detener la aplicación en el tutorial de H2.
–Andrew Cowenhoven
29 de junio de 2015 a las 15:06
También puede eliminar el archivo de la base de datos de archivos h2 y el problema desaparecerá.
jdbc:h2:~/dbname significa que la base de datos del archivo h2 con el nombre db name se creará en el directorio de inicio del usuario (~/ significa directorio de inicio del usuario, espero que trabaje en Linux).
En mi máquina local está presente en: /home/jack/dbname.mv.db No sé por qué el archivo tiene un nombre dbname.mv.db en lugar de un dbname. Puede ser una configuración predeterminada de h2. Elimino este archivo:
rm ~/dbname.mv.db
O:
cd ~/
rm dbname.mv.db
La base de datos dbname se eliminará con todos los datos. Después de iniciar la nueva base de datos, todo estará bien.