¿Hay alguna forma de examinar el contenido de una base de datos en memoria H2 o HSQLDB para verlo? Por ejemplo, durante una sesión de depuración con Hibernate para verificar cuándo se ejecuta el flush; o para asegurarse de que la secuencia de comandos que crea una instancia de la base de datos dé el resultado esperado.
¿Existe un complemento o una biblioteca que pueda incrustar con su código para permitir esto?
Por favor, mencione de cuál está hablando (H2 o HSQLDB) en caso de que tenga una respuesta específica para alguno de ellos.
hsqldb
h2
in-memory-database
jplandrain
fuente
fuente
Respuestas:
Puede ejecutar el servidor web H2 dentro de su aplicación que accederá a la misma base de datos en memoria. También puede acceder al H2 que se ejecuta en modo servidor utilizando cualquier cliente JDBC genérico como SquirrelSQL .
ACTUALIZAR:
Server webServer = Server.createWebServer("-web,-webAllowOthers,true,-webPort,8082").start(); Server server = Server.createTcpServer("-tcp,-tcpAllowOthers,true,-tcpPort,9092").start();
Ahora puede conectarse a su base de datos a través de una
jdbc:h2:mem:foo_db
URL dentro del mismo proceso o navegar por lafoo_db
base de datos usandolocalhost:8082
. Recuerde cerrar ambos servidores. Consulte también: La consola no puede acceder a la base de datos H2 en modo memoria .También puedes usar Spring:
<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer"> <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,9092"/> </bean> <bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop"> <constructor-arg value="-web,-webAllowOthers,true,-webPort,8082"/> </bean> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" depends-on="h2Server"> <property name="driverClass" value="org.h2.Driver"/> <property name="jdbcUrl" value="jdbc:h2:mem:foo_db"/> </bean>
Por cierto, solo debe depender de las afirmaciones y no de la inspección manual del contenido de la base de datos. Use esto solo para solucionar problemas.
Nota: si usa el marco de prueba de Spring, no verá los cambios realizados por una transacción en ejecución y esta transacción se revertirá inmediatamente después de la prueba.
fuente
<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers")
Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
Para H2, puede iniciar un servidor web dentro de su código durante una sesión de depuración si tiene un objeto de conexión de base de datos. Puede agregar esta línea a su código, o como una 'expresión de observación' (dinámicamente):
La herramienta del servidor iniciará un navegador web localmente que le permitirá acceder a la base de datos.
fuente
DataSource
instancia a mi caso de prueba y agregué un método con bodyorg.h2.tools.Server.startWebServer(dataSource.getConnection());
. Ahora, evaluar ese método abre el navegador. Tenga en cuenta que esto hace que la ejecución se suspenda hasta que se desconecte (icono en la parte superior izquierda del navegador).En H2, lo que me funciona es:
Codifico, iniciando el servidor como:
Eso inicia el servidor en el
localhost
puerto 9092.Luego, en el código, establezca una conexión de base de datos en la siguiente URL de JDBC:
Durante la depuración, como cliente para inspeccionar la base de datos, utilizo el proporcionado por H2, que es lo suficientemente bueno, para iniciarlo solo necesita iniciar el siguiente java main por separado
Esto iniciará un servidor web con una aplicación en 8082, iniciará un navegador en
localhost:8082
Y luego puede ingresar la URL anterior para ver la base de datos
fuente
Con HSQLDB, tiene varias opciones integradas.
Hay dos administradores de bases de datos GUI y una interfaz de línea de comandos para la base de datos. Las clases para estos son:
Puede iniciar uno de los anteriores desde su aplicación y acceder a las bases de datos en memoria.
Aquí se da un ejemplo con JBoss:
http://docs.jboss.org/jbpm/v3.2/userguide/html/ch07s03.html
También puede iniciar un servidor con su aplicación, apuntándolo a una base de datos en memoria.
fuente
Puede exponerlo como una función JMX, iniciable a través de JConsole:
Contexto XML:
fuente
Este es un controlador Play 2 para inicializar los servidores H2 TCP y Web:
package controllers; import org.h2.tools.Server; import play.mvc.Controller; import play.mvc.Result; import java.sql.SQLException; /** * Play 2 controller to initialize H2 TCP Server and H2 Web Console Server. * * Once it's initialized, you can connect with a JDBC client with * the URL `jdbc:h2:tcp://127.0.1.1:9092/mem:DBNAME`, * or can be accessed with the web console at `http://localhost:8082`, * and the URL JDBC `jdbc:h2:mem:DBNAME`. * * @author Mariano Ruiz <[email protected]> */ public class H2ServerController extends Controller { private static Server h2Server = null; private static Server h2WebServer = null; public static synchronized Result debugH2() throws SQLException { if (h2Server == null) { h2Server = Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092"); h2Server.start(); h2WebServer = Server.createWebServer("-web","-webAllowOthers","-webPort","8082"); h2WebServer.start(); return ok("H2 TCP/Web servers initialized"); } else { return ok("H2 TCP/Web servers already initialized"); } } }
fuente
Para HSQLDB, lo siguiente funcionó para mí:
Y esto hizo que apareciera la GUI con mis tablas y datos una vez que lo apunté a la base de datos in-mem con el nombre correcto.
Básicamente, es el equivalente a actualizar a
DatabaseManager
(la variedad que no es Swing), que solicita los detalles de la conexión y está configurado en--noexit
)También probé la versión Swing, pero solo tenía un
main
, y no estaba seguro de los argumentos para aprobar. Si alguien lo sabe, publique aquí.Solo porque busqué durante horas el nombre correcto de la base de datos: el nombre de la base de datos es el nombre de su fuente de datos. Así que intente con la URL jdbc: hsqldb: mem: dataSource si tiene un bean de fuente de datos con id = dataSource. Si esto no funciona, pruebe testdb, que es el predeterminado.
fuente
Tengo un problema con la conexión remota de la versión H2 1.4.190 a inMemory (así como en el archivo) con
Connection is broken: "unexpected status 16843008"
hasta que no baje a 1.3.176. Ver Grails que acceden al servidor H2 TCP se cuelganfuente
Esto es más un comentario a la publicación anterior de Thomas Mueller que una respuesta, pero no tengo suficiente reputación para ello. Otra forma de obtener la conexión si es Spring JDBC Template es usando lo siguiente:
Entonces, en el modo de depuración, si agrega a la vista "Expresiones" en Eclipse, se abrirá el navegador que le mostrará la Consola H2:
Vista de expresiones de Eclipse
Consola H2
fuente
No sé por qué funciona bien en sus máquinas, pero tuve que pasar un día para que funcionara.
El servidor funciona con Intellij Idea U a través de la url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".
"localhost: 8082" en el navegador también funciona bien.
Agregué esto en mvc-dispatcher-servlet.xml
fuente
¿Qué hay de ver cómodamente (y también editar) el contenido a través de ODBC y MS-Access, Excel? Versiones de software:
Servidor H2:
Configuración de la fuente de datos ODBC de Windows10 que puede ser utilizada por cualquier cliente ODBC: En el campo Databse, se debe usar el nombre dado en el parámetro '-key'.
fuente