Tengo una base de datos H2 con URL "jdbc:h2:test"
. Creo una tabla usando CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Luego selecciono todo de esta tabla (vacía) usando SELECT * FROM PERSON
. Hasta aquí todo bien.
Sin embargo, si cambio la URL a "jdbc:h2:mem:test"
, la única diferencia es que la base de datos ahora está solo en la memoria, esto me da un org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Probablemente me estoy perdiendo algo simple aquí, pero cualquier ayuda sería apreciada.
Person
volver a crear la tabla . H2 no sabe nada sobre la base de datos que creó en el disco antes.Respuestas:
DB_CLOSE_DELAY=-1
hbm2ddl cierra la conexión después de crear la tabla, por lo que h2 la descarta.
Si tienes tu URL de conexión configurada de esta manera
el contenido de la base de datos se pierde en el momento en que se cierra la última conexión.
Si desea mantener su contenido, debe configurar la URL de esta manera
Si lo hace, h2 mantendrá su contenido mientras dure la vm .
Observe el punto y coma (
;
) en lugar de dos puntos (:
).Consulte la sección Bases de datos en memoria de la página Características . Citar:
fuente
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
, no funciona.Sé que este no fue su caso, pero tuve el mismo problema porque H2 estaba creando las tablas con MAYÚSCULAS y luego se comportaba con mayúsculas y minúsculas, aunque en todas las secuencias de comandos (incluidas las de creación) utilicé minúsculas.
Resuelto agregando
;DATABASE_TO_UPPER=false
a la URL de conexión.fuente
DATABASE_TO_UPPER=false
como una declaración SQL en un script de inicio? (De manera similar como una declaración comoSET MODE PostgreSQL;
) Si es así, ¿cuál es la sintaxis exacta?Difícil de decir. Creé un programa para probar esto:
La prueba se ejecutó hasta su finalización, sin fallas y sin resultados inesperados. ¿Qué versión de h2 estás ejecutando?
fuente
La base de datos H2 en memoria almacena datos en la memoria dentro de la JVM. Cuando la JVM sale, estos datos se pierden.
Sospecho que lo que está haciendo es similar a las dos clases de Java a continuación. Una de estas clases crea una tabla y la otra intenta insertarla:
y
Cuando ejecuté estas clases una tras otra, obtuve el siguiente resultado:
Tan pronto como
java
se cierra el primer proceso, la tabla creada porCreateTable
ya no existe. Entonces, cuando aparece la clase InsertIntoTable, no hay una tabla para insertarla.Cuando cambié las cadenas de conexión a
jdbc:h2:test
, encontré que no había tal error. También encontré quetest.h2.db
había aparecido un archivo . Aquí era donde H2 había colocado la tabla, y como se había almacenado en el disco, la tabla todavía estaba allí para que la clase InsertIntoTable la encontrara.fuente
registerDriver()
llamada es innecesaria: Primero: un Class.forName () hace lo mismo para la mayoría de los controladores JDBC y (lo que es más importante) es completamente innecesario para Java 6 y superiores, que detecta automáticamente los controladores JDBC (compatibles) en el classpathHe intentado agregar
Sin embargo, eso no ayudó. En el sitio H2 , encontré lo siguiente, que de hecho podría ayudar en algunos casos.
Sin embargo , mi problema era que solo el esquema se suponía que era diferente al predeterminado. Tan insted de usar
Tuve que usar:
Entonces las mesas fueron visibles
fuente
Tuve el mismo problema y cambié mi configuración en application-test.properties a esto:
Y mis dependencias:
Y las anotaciones utilizadas en la clase de prueba:
fuente
Estaba tratando de recuperar los metadatos de la tabla, pero tuve el siguiente error:
Utilizando:
devolvió un ResultSet vacío.
Pero usar la siguiente URL en su lugar funcionó correctamente:
Era necesario especificar: DATABASE_TO_UPPER = false
fuente
Al abrir la consola h2, la URL JDBC debe coincidir con la especificada en las propiedades:
Lo cual parece obvio, pero pasé horas resolviendo esto ...
fuente
Se resolvió creando una nueva carpeta src / test / resources + inserte el archivo application.properties, especificando explícitamente la creación de una base de datos de prueba:
fuente
Vine a esta publicación porque tuve el mismo error.
En mi caso, las evoluciones de la base de datos no se ejecutaron, por lo que la tabla no estaba allí en absoluto.
Mi problema fue que la estructura de carpetas para los scripts de evolución era incorrecta.
de: https://www.playframework.com/documentation/2.0/Evolutions
Tenía una carpeta llamada conf / evolutions.default creada por eclipse. El problema desapareció después de corregir la estructura de la carpeta a conf / evolutions / default
fuente
fuente
Tuve exactamente el mismo problema, probé todo lo anterior, pero sin éxito. La causa bastante divertida del error fue que la JVM comenzó demasiado rápido, antes de que se creara la tabla DB (usando un archivo data.sql en src.main.resources). Así que puse un temporizador Thread.sleep (1000) para esperar solo un segundo antes de llamar a "select * from person". Trabajando perfectamente ahora.
application.properties:
data.sql:
PersonJdbcDAO.java:
clase principal:
fuente
Lo encontré funcionando después de agregar la dependencia de Spring Data JPA en la versión de arranque 2.2.6 de Spring.
Agregue la configuración H2 DB en application.yml -
fuente
Encontré la solución agregando esta configuración:
La configuración completa (con spring.datasource.url simple):
Estoy trabajando con h2 versión 1.4.200 y Spring-Boot 2.2.6.
fuente
Time.sleep (1000);
Esto es trabajo para mi. Solo para probar, si su PC es lenta, puede aumentar la duración del subproceso para que DB funcione bien y JVM pueda obtener nuestra tabla.
fuente