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

90

¿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.

jplandrain
fuente
¿Responde esto a tu pregunta? Inspeccione en la memoria hsqldb durante la depuración
rogerdpack

Respuestas:

59

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_dbURL dentro del mismo proceso o navegar por la foo_dbbase de datos usando localhost: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.

Tomasz Nurkiewicz
fuente
2
Recibí el error de que "verdadero" es una opción no válida. ¿-WebAllowOthers solía tomar el parámetro? Con el último código H2, no toma ningún parámetro. Mire el método "principal" aquí: h2database.com/javadoc/org/h2/tools/Server.html
hshib
1
Como mencionó hman, la última versión no acepta el parámetro "verdadero", así que simplemente elimínelo:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R
2
Las nuevas versiones siguen la convención de argumentos separada de Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor
7
En Java puro, debe eliminar el parámetro "verdadero" y separar los parámetros de esta manera:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre
2
Con Spring Boot, simplemente puede configurar "h2.console.enabled: true" y "h2.console.path: h2-console" en su archivo application.properties.
user2754985
33

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):

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

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

Thomas Mueller
fuente
5
Comente para aquellos que están usando Spring Data: puede obtener una conexión desde ApplicationContext de esta manera: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus
esto también es genial en un JUnit TestWatcher @Rule
weberjn
3
Incluso funciona si lo ejecuta con "evaluExpression" en intelliJ durante la depuración. (bloquea el resto de los relojes hasta que se detenga)
borjab
Conecté automáticamente la DataSourceinstancia a mi caso de prueba y agregué un método con body org.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).
Tom
9

En H2, lo que me funciona es:

Codifico, iniciando el servidor como:

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

Eso inicia el servidor en el localhostpuerto 9092.

Luego, en el código, establezca una conexión de base de datos 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 el proporcionado por H2, que es lo suficientemente bueno, para iniciarlo solo necesita iniciar el siguiente java main 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 la base de datos

dsantaolalla
fuente
4

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:

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.

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.

org.hsqldb.Server
Fredt
fuente
De acuerdo con los documentos, puede usar un "administrador" con cualquier conexión JDBC, por lo que esto también funcionaría para H2 :) hsqldb.org/doc/2.0/util-guide/dbm-chapt.html
rogerdpack
3

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 />
sibidiba
fuente
3

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");
        }
    }
}
Mariano Ruiz
fuente
3

Para HSQLDB, lo siguiente funcionó para mí:

DatabaseManager.threadedDBM();

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.

conocido asilya
fuente
3
org.hsqldb.util.DatabaseManagerSwing.main (new String [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk
Aquí hay una explicación de los parámetros: stackoverflow.com/a/3076005/32453
rogerdpack
1

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:

jdbcTemplate.getDataSource().getConnection();

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:

org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());

Vista de expresiones de Eclipse

Consola H2

Jacqueline Rodríguez
fuente
0

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

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" depends-on="h2Server">
    <property name="driverClassName" value="org.h2.Driver"/>
    <property name="url" value="jdbc:h2:tcp://localhost:9092/~/default"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer">
    <constructor-arg>
        <array>
            <value>-tcp</value>
            <value>-tcpAllowOthers</value>
            <value>-tcpPort</value>
            <value>9092</value>
        </array>
    </constructor-arg>
</bean>

<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop">
    <constructor-arg>
        <array>
            <value>-web</value>
            <value>-webAllowOthers</value>
            <value>-webPort</value>
            <value>8082</value>
        </array>
    </constructor-arg>
</bean>
Eugene Kortov
fuente
0

¿Qué hay de ver cómodamente (y también editar) el contenido a través de ODBC y MS-Access, Excel? Versiones de software:

  • Versión H2: 1.4.196
  • Win 10 Postgres ODBC Versión del controlador: psqlodbc_09_03_0210
  • Para el cliente ODBC de Win7: win7_psqlodbc_09_00_0101-x64.msi

Servidor H2:

/*
For JDBC Clients to connect:
jdbc:h2:tcp://localhost:9092/trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=60000;CACHE_SIZE=131072;CACHE_TYPE=TQ
*/
public class DBStarter {
    public static final String BASEDIR = "/C:/Trader/db/";
    public static final String DB_URL = BASEDIR + "trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=10000;CACHE_SIZE=131072;CACHE_TYPE=TQ";

  static void startServer() throws SQLException {
        Server tcpServer = Server.createTcpServer(
                "-tcpPort", "9092",
                "-tcpAllowOthers",
                "-ifExists",
//                "-trace",
                "-baseDir", BASEDIR
        );
        tcpServer.start();
        System.out.println("H2 JDBC Server started:  " + tcpServer.getStatus());

        Server pgServer = Server.createPgServer(
                "-pgPort", "10022",
                "-pgAllowOthers",
                "-key", "traderdb", DB_URL
        );
        pgServer.start();
        System.out.println("H2 ODBC PGServer started: " + pgServer.getStatus());

    }
}   

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'. Configuración ODBC

YDZOGODOQ
fuente