Frage Zeigen Sie den Inhalt der In-Memory-Datenbank H2 oder HSQLDB an


Gibt es eine Möglichkeit, den Inhalt einer H2- oder HSQLDB-In-Memory-Datenbank zum Anzeigen zu durchsuchen? Zum Beispiel während einer Debugging-Sitzung mit Hibernate, um zu prüfen, wann der Flush ausgeführt wird; oder um sicherzustellen, dass das Skript, das die Datenbank instanziiert, das erwartete Ergebnis liefert.

Existiert ein Addon oder eine Bibliothek, die Sie mit Ihrem Code einbetten können, um dies zu ermöglichen?

Bitte erwähnen Sie, über welches Sie sprechen (H2 oder HSQLDB), falls Sie eine spezifische Antwort haben.


75
2017-09-05 14:20


Ursprung


Antworten:


Sie können H2 ausführen Webserver innerhalb Ihrer Anwendung, die auf die gleiche In-Memory-Datenbank zugreifen wird. Sie können den H2 auch im Server-Modus mit einem beliebigen generischen JDBC-Client wie z EichhörnchenSQL.

AKTUALISIEREN:

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

Jetzt können Sie sich mit Ihrer Datenbank verbinden jdbc:h2:mem:foo_db URL innerhalb desselben Prozesses oder durchsuchen Sie die foo_db Datenbank verwenden localhost:8082. Denken Sie daran, beide Server zu schließen. Siehe auch: Auf die H2-Datenbank im Speichermodus kann nicht über die Konsole zugegriffen werden.

Sie können auch Spring verwenden:

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

Übrigens sollte man sich nur auf Aussagen verlassen und nicht auf den Datenbankinhalt manuell zugreifen. Verwenden Sie dies nur zur Fehlerbehebung.

N.B. Wenn Sie das Spring-Test-Framework verwenden, sehen Sie keine Änderungen, die von einer laufenden Transaktion vorgenommen werden. Diese Transaktion wird unmittelbar nach dem Test zurückgesetzt.


49
2017-09-05 14:27



Für H2 kannst du Starten Sie einen Webserver in Ihrem Code während einer Debugsitzung, wenn Sie ein Datenbankverbindungsobjekt haben. Sie könnten diese Zeile zu Ihrem Code hinzufügen oder als 'Watch-Ausdruck' (dynamisch):

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

Das Server-Tool startet lokal einen Webbrowser, mit dem Sie auf die Datenbank zugreifen können.


26
2017-09-06 05:09



Im H2 funktioniert für mich:

Ich Code, Starten des Servers wie:

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

Das startet den Server localhost Port 9092.

Erstellen Sie anschließend im Code eine DB-Verbindung für die folgende JDBC-URL:

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

Während des Debuggens, als Client zum Inspizieren der DB verwende ich die von H2 zur Verfügung gestellte, die gut genug ist, um es zu starten, müssen Sie nur die folgende Java-Haupt separat starten

org.h2.tools.Console

Dies startet einen Webserver mit einer App auf 8082, starten Sie einen Browser auf localhost:8082

Und dann können Sie die vorherige URL eingeben, um die DB zu sehen


7
2018-05-03 14:51



Mit HSQLDB haben Sie mehrere integrierte Optionen.

Es gibt zwei GUI-Datenbankmanager und eine Befehlszeilenschnittstelle für die Datenbank. Die Klassen für diese sind:

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

Sie können eines der oben genannten Programme aus Ihrer Anwendung starten und auf die In-Memory-Datenbanken zugreifen.

Ein Beispiel mit JBoss wird hier gegeben:

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

Sie können auch einen Server mit Ihrer Anwendung starten, indem Sie ihn auf eine In-Memory-Datenbank verweisen.

org.hsqldb.Server

4
2017-09-05 16:08



Sie können es als JMX-Feature bereitstellen, das über JConsole gestartet werden kann:

@ManagedResource
@Named
public class DbManager {

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

XML-Kontext:

<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



Dies ist ein Play 2 Controller, um die H2 TCP und Web Server zu initialisieren:

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



Für HSQLDB, Folgendes funktionierte für mich:

DatabaseManager.threadedDBM();

Und das brachte die GUI mit meinen Tabellen und Daten auf.

Ich habe auch die Swing-Version ausprobiert, aber es hatte nur eine mainund ich war mir der Argumente nicht sicher. Wenn jemand weiß, bitte hier posten.

Nur weil ich stundenlang nach dem richtigen Datenbanknamen gesucht habe: Der Name der Datenbank ist der Name Ihrer Datenquelle. Versuchen Sie es mit der URL jdbc: hsqldb: mem: dataSource, wenn Sie eine Datenquellen-Bean mit id = dataSource haben. Wenn dies nicht funktioniert, versuchen Sie testdb als Standard.


1
2017-12-05 21:07



Ich habe ein Problem mit H2-Version 1.4.190 Remote-Verbindung zu InMemory (sowie in Datei) mit Connection is broken: "unexpected status 16843008" bis nicht auf 1.3.176 herunterstufen. Sehen Grails, die auf den H2-TCP-Server zugreifen, hängen


1
2017-11-15 11:37



Ich weiß nicht, warum es bei deinen Maschinen gut funktioniert, aber ich musste einen Tag verbringen, um zu bekommen, dass es funktioniert.

Der Server arbeitet mit Intellij Idea U über die URL "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" im Browser funktioniert auch gut.

Ich habe dies in die mvc-dispatcher-servlet.xml hinzugefügt

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

0
2018-03-09 09:22