Pregunta

¿Hay alguna forma de explorar el contenido de una base de datos H2 o HSQLDB In Memory 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 instancie el DB proporcione el resultado esperado.

¿Existe un complemento o una biblioteca que puede incrustar con su código para permitir esto?

Por favor, mencione de qué se está hablando (H2 o HSQLDB) en caso de que tenga una respuesta específica para uno de ellos.

¿Fue útil?

Solución

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 JDBC genérico como Ardilla.

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 explorar el foo_db base de datos utilizando localhost:8082. Recuerde cerrar ambos servidores. Ver también: No se puede acceder a la base de datos H2 en el modo de memoria por consola.

También puedes usar la primavera:

<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 del manual que asomen el contenido de la base de datos. Use esto solo para solucionar problemas.

NB 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 retirará inmediatamente después de la prueba.

Otros consejos

Para H2, puedes Inicie 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 reloj' (dinámicamente):

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

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

En H2, lo que funciona para mí es:

Código, iniciando el servidor como:

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

Que inicia el servidor en localhost Puerto 9092.

Luego, en código, establezca una conexión DB en la siguiente URL JDBC:

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

Mientras depuración, como cliente para inspeccionar el DB, utilizo el proporcionado por H2, que es lo suficientemente bueno, para lanzarlo, solo necesita lanzar el siguiente Java Main por separado

org.h2.tools.Console

Esto iniciará un servidor web con una aplicación en 8082, inicie un navegador en localhost:8082

Y luego puede ingresar a la URL anterior para ver el DB

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.

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, señalándolo a una base de datos en memoria.

org.hsqldb.Server

Puede exponerlo como una función JMX, que se cree 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 />

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 <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");
        }
    }
}

Para HSQLDB, lo siguiente funcionó para mí:

DatabaseManager.threadedDBM();

Y esto mencionó la GUI con mis tablas y datos.

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

Solo porque busqué horas para el nombre de la base de datos correcto: el nombre de la base de datos es el nombre de su fuente de datos. Así que intente con URL JDBC: HSQLDB: MEM: DataSource si tiene una fuente de datos Bean con id = DataSource. Si esto no funciona, intente TestDB, que es el valor predeterminado.

Tengo un problema con H2 versión 1.4.190 conexión remota a InMemory (así como en el archivo) con Connection is broken: "unexpected status 16843008" Hasta que no se reduzca a 1.3.176. Ver Grails que accede al servidor H2 TCP cuelgan

No sé por qué funciona bien en sus máquinas, pero tuve que pasar un día para que funcione.

El servidor funciona con IntelliJ Idea U a través de URL "JDBC: H2: tcp: // localhost: 9092/~/default".

"Localhost: 8082" en el navegador Alse funciona bien.

Agregué esto en el 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>

Este es más un comentario a la publicación anterior de Thomas Mueller en lugar de una respuesta, pero no tiene suficiente reputación por ello. Otra forma de obtener la conexión si eres plantilla Spring JDBC es usar lo siguiente:

jdbcTemplate.getDataSource().getConnection();

Entonces, en modo de depuración, si agrega a la vista "Expresiones" en Eclipse, abrirá el navegador que le muestra la consola H2:

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

Vista de expresiones de eclipse

Consola H2

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top