tutorial - Ver el contenido de la base de datos en memoria H2 o HSQLDB
hsqldb vs h2 (9)
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
¿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.
En H2, lo que funciona para mí es:
Cifro, comenzando el servidor como:
server = Server.createTcpServer().start();
Eso inicia el servidor en el puerto localhost
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
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 <[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");
}
}
}
No sé por qué funciona bien en las máquinas de su propiedad, 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 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>
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 de servidor iniciará un navegador web localmente que le permite acceder a la base de datos.
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.
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 jdbc:h2:mem:foo_db
URL dentro del mismo proceso o explorar la foo_db
datos foo_db
usando localhost:8082
. Recuerde cerrar ambos servidores. Consulte también: la consola no puede acceder a la base de datos H2 en modo de 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.
Nota: 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.
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 />
Tengo un problema con la versión 1.4.190 de la conexión remota a inMemory (así como en el archivo) con la Connection is broken: "unexpected status 16843008"
hasta que no se degrada a 1.3.176. Ver Grails accediendo al servidor TCP H2 se cuelga