Pregunta Ver el contenido de la base de datos en memoria H2 o HSQLDB


¿Hay alguna manera de examinar el contenido de una base de datos en memoria de H2 o HSQLDB para ver? Por ejemplo, durante una sesión de depuración con Hibernate para verificar cuándo se ejecuta la descarga; o para asegurarse de que el script que crea la 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 cuál de ellos está hablando (H2 o HSQLDB) en caso de que tenga una respuesta específica para uno de ellos.


75
2017-09-05 14:20


origen


Respuestas:


Puedes ejecutar H2 Servidor web 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 genérico JDBC 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 jdbc:h2:mem:foo_db URL dentro del mismo proceso o navega por foo_db base de datos usando localhost:8082. Recuerde cerrar ambos servidores. Ver 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 deberías depender de las aserciones y no del manual que examina los contenidos de la base de datos. Úselo solo para solucionar problemas.

nótese bien si utiliza Spring test framework, no verá los cambios realizados por una transacción en ejecución y esta transacción se retrotraerá inmediatamente después de la prueba.


49
2017-09-05 14:27



Para H2, puedes inicia un servidor web dentro de tu 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):

org.h2.tools.Server.startWebServer(conn);

La herramienta de servidor iniciará un navegador web localmente que le permite acceder a la base de datos.


26
2017-09-06 05:09



En H2, lo que funciona para mí es:

Cifro, comenzando el servidor como:

server = Server.createTcpServer().start();

Eso inicia el servidor localhost puerto 9092.

Luego, en el código, establezca una conexión de BD en la siguiente URL de JDBC:

jdbc:h2:tcp://localhost:9092/mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL

Durante la depuración, como cliente para inspeccionar la base de datos, utilizo la proporcionada por H2, que es lo suficientemente buena, para iniciarla solo necesita ejecutar la siguiente unidad principal de Java por separado.

org.h2.tools.Console

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 el DB


7
2018-05-03 14:51



Con HSQLDB, tiene varias opciones incorporadas.

Hay dos administradores de bases de datos GUI y una interfaz de línea de comando para la base de datos. Las clases para estos son:

org.hsqldb.util.DatabaseManager
org.hsqldb.util.DatabaseManagerSwing
org.hsqldb.cmdline.SqlTool

Puede iniciar uno de los anteriores desde su aplicación y acceder a las bases de datos en memoria.

Un ejemplo con JBoss se da aquí:

http://docs.jboss.org/jbpm/v3.2/userguide/html/ch07s03.html

También puede iniciar un servidor con su aplicación, apuntando a una base de datos en memoria.

org.hsqldb.Server

4
2017-09-05 16:08



Puede exponerlo como una función JMX, iniciable a través de JConsole:

@ManagedResource
@Named
public class DbManager {

    @ManagedOperation(description = "Start HSQL DatabaseManagerSwing.")
    public void dbManager() {
        String[] args = {"--url", "jdbc:hsqldb:mem:embeddedDataSource", "--noexit"};
        DatabaseManagerSwing.main(args);
    }
}

Contexto XML:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />

3
2017-10-29 17:58



Este es un controlador de 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 <mrsarm@gmail.com>
 */
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");
        }
    }
}

2
2018-05-19 12:50



Para HSQLDB, lo siguiente funcionó para mí:

DatabaseManager.threadedDBM();

Y esto llevó a la GUI con mis tablas y datos.

También probé la versión Swing, pero solo tenía una main, y no estaba seguro de los argumentos para aprobar. Si alguien sabe, publique aquí.

Solo porque busqué horas para el nombre correcto de la base de datos: el nombre de la base de datos es el nombre de su fuente de datos. Intente con la URL jdbc: hsqldb: mem: dataSource si tiene un origen de datos bean con id = dataSource. Si esto no funciona, pruebe testdb, que es el predeterminado.


1
2017-12-05 21:07



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 disminuya a 1.3.176. Ver Grails que accede al servidor TCP H2 se cuelga


1
2017-11-15 11:37