Visualize o conteúdo do banco de dados H2 ou HSQLDB na memória

90

Existe uma maneira de navegar pelo conteúdo de um banco de dados H2 ou HSQLDB na memória para visualização? Por exemplo, durante uma sessão de depuração com o Hibernate para verificar quando o flush é executado; ou para garantir que o script que instancia o banco de dados forneça o resultado esperado.

Existe um addon ou uma biblioteca que você pode incorporar ao seu código para permitir isso?

Mencione de qual você está falando (H2 ou HSQLDB) caso tenha uma resposta específica para algum deles.

jplandrain
fonte

Respostas:

59

Você pode executar o servidor da web H2 em seu aplicativo que acessará o mesmo banco de dados na memória. Você também pode acessar o H2 em execução no modo de servidor usando qualquer cliente JDBC genérico como SquirrelSQL .

ATUALIZAR:

Server webServer = Server.createWebServer("-web,-webAllowOthers,true,-webPort,8082").start();
Server server = Server.createTcpServer("-tcp,-tcpAllowOthers,true,-tcpPort,9092").start();

Agora você pode se conectar ao seu banco de dados via jdbc:h2:mem:foo_dbURL dentro do mesmo processo ou navegar no foo_dbbanco de dados usando localhost:8082. Lembre-se de fechar os dois servidores. Veja também: O banco de dados H2 em modo de memória não pode ser acessado pelo Console .

Você também pode 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>

BTW, você só deve depender de asserções e não da exibição manual do conteúdo do banco de dados. Use isso apenas para solução de problemas.

NB, se você usar o framework de teste Spring, você não verá as alterações feitas por uma transação em execução e esta transação será revertida imediatamente após o teste.

Tomasz Nurkiewicz
fonte
2
Recebi o erro de que "verdadeiro" é uma opção inválida. -WebAllowOthers costumava usar o parâmetro? Com o código H2 mais recente, não requer nenhum parâmetro. Veja o método "principal" aqui: h2database.com/javadoc/org/h2/tools/Server.html
hshib
1
Como hman mencionou, a versão mais recente não aceita o parâmetro "verdadeiro", então apenas remova-o:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R
2
As novas versões seguem a convenção de argumento separada de Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor
7
Em Java puro, você deve remover o parâmetro "true" e separar os parâmetros assim:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre
2
Com o Spring Boot, você pode simplesmente definir "h2.console.enabled: true" e "h2.console.path: h2-console" em seu arquivo application.properties.
user2754985
31

Para H2, você pode iniciar um servidor da web dentro de seu código durante uma sessão de depuração se você tiver um objeto de conexão de banco de dados. Você pode adicionar esta linha ao seu código ou como uma 'expressão de observação' (dinamicamente):

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

A ferramenta do servidor iniciará um navegador da web localmente que permite acessar o banco de dados.

Thomas Mueller
fonte
4
Comentário para aqueles que estão usando Spring Data - você pode obter a conexão de ApplicationContext desta forma: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus
isso também é ótimo em um JUnit TestWatcher @Rule
weberjn
3
Ele funciona até mesmo se você iniciar com "evaluateExpression" no intelliJ durante a depuração. (trava o resto dos relógios até parar)
borjab
9

No H2, o que funciona para mim é:

Eu código, iniciando o servidor como:

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

Isso inicia o servidor na localhostporta 9092.

Em seguida, no código, estabeleça uma conexão de banco de dados no seguinte URL JDBC:

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

Durante a depuração, como cliente para inspecionar o banco de dados, eu uso o fornecido por H2, que é bom o suficiente, para iniciá-lo você só precisa iniciar o seguinte java main separadamente

org.h2.tools.Console

Isso iniciará um servidor web com um aplicativo em 8082, iniciará um navegador em localhost:8082

E então você pode inserir o URL anterior para ver o banco de dados

dsantaolalla
fonte
4

Com HSQLDB, você tem várias opções integradas.

Existem dois gerenciadores de banco de dados GUI e uma interface de linha de comandos para o banco de dados. As aulas para eles são:

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

Você pode iniciar um dos itens acima em seu aplicativo e acessar os bancos de dados na memória.

Um exemplo com JBoss é dado aqui:

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

Você também pode iniciar um servidor com seu aplicativo, apontando-o para um banco de dados na memória.

org.hsqldb.Server
Fredt
fonte
3

Você pode expô-lo como um recurso JMX, inicializável via 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
fonte
3

Este é um controlador Play 2 para inicializar os servidores H2 TCP e 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
fonte
2

Para HSQLDB, o seguinte funcionou para mim:

DatabaseManager.threadedDBM();

E isso trouxe a GUI com minhas tabelas e dados.

Eu também tentei a versão Swing, mas ela tinha apenas um main, e eu não tinha certeza dos argumentos a serem aprovados. Se alguém souber, poste aqui.

Só porque procurei por horas pelo nome certo do banco de dados: O nome do banco de dados é o nome da sua fonte de dados. Portanto, tente com a URL jdbc: hsqldb: mem: dataSource se você tiver um bean de origem de dados com id = dataSource. Se isso não funcionar, tente testdb que é o padrão.

knownasilya
fonte
3
org.hsqldb.util.DatabaseManagerSwing.main (new String [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk
1

Tenho um problema com a conexão remota do H2 versão 1.4.190 para inMemory (assim como no arquivo) com Connection is broken: "unexpected status 16843008"até não fazer downgrade para 1.3.176. Veja Grails acessando travamentos do servidor TCP H2

Grigory Kislin
fonte
1

Este é mais um comentário ao post anterior de Thomas Mueller do que uma resposta, mas não tenho reputação suficiente para isso. Outra maneira de obter a conexão se você for um modelo Spring JDBC é usando o seguinte:

jdbcTemplate.getDataSource().getConnection();

Portanto, no modo de depuração, se você adicionar à visualização "Expressões" no Eclipse, ele abrirá o navegador mostrando o Console H2:

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

Visualização de expressões do Eclipse

H2 Console

Jacqueline Rodriguez
fonte
0

Não sei por que está funcionando bem nas suas máquinas, mas tive que passar um dia para que funcione.

O servidor funciona com Intellij Idea U via url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" no navegador também funciona bem.

Eu adicionei isso ao 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
fonte
0

Que tal visualizar confortavelmente (e também editar) o conteúdo em ODBC e MS-Access, Excel? Softwareversions ::

  • Versão H2: 1.4.196
  • Versão do driver ODBC do Win 10 Postgres: psqlodbc_09_03_0210
  • Para cliente ODBC 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());

    }
}   

Configuração da fonte de dados ODBC do Windows10 que pode ser utilizada por qualquer cliente ODBC: No campo Databse deve ser utilizado o nome dado no parâmetro '-key'. Configuração ODBC

YDZOGODOQ
fonte