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

89

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 überprüfen, wann der Flush ausgeführt wird. oder um sicherzustellen, dass das Skript, das die Datenbank instanziiert, das erwartete Ergebnis liefert.

Gibt es ein Addon oder eine Bibliothek, die Sie in Ihren Code einbetten können, um dies zu ermöglichen?

Bitte geben Sie an, um welche es sich handelt (H2 oder HSQLDB), falls Sie eine spezifische Antwort auf eine dieser Fragen haben.

jplandrain
quelle

Antworten:

57

Sie können den H2 -Webserver in Ihrer Anwendung ausführen , der auf dieselbe speicherinterne Datenbank zugreift. Sie können auch mit einem generischen JDBC-Client wie SquirrelSQL auf den H2 zugreifen, der im Servermodus ausgeführt wird .

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 jdbc:h2:mem:foo_dbinnerhalb desselben Prozesses über eine URL eine Verbindung zu Ihrer Datenbank herstellen oder die foo_dbDatenbank mit durchsuchen localhost:8082. Denken Sie daran, beide Server zu schließen. Siehe auch: Auf die H2-Datenbank im Speichermodus kann die Konsole nicht zugreifen .

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 sollten Sie sich nur auf Behauptungen verlassen und nicht auf das manuelle Durchsuchen des Datenbankinhalts. Verwenden Sie dies nur zur Fehlerbehebung.

Hinweis: Wenn Sie das Spring-Test-Framework verwenden, werden keine Änderungen angezeigt, die von einer laufenden Transaktion vorgenommen wurden, und diese Transaktion wird unmittelbar nach dem Test zurückgesetzt.

Tomasz Nurkiewicz
quelle
2
Ich habe die Fehlermeldung erhalten, dass "true" eine ungültige Option ist. Hat -webAllowOthers Parameter verwendet? Mit dem neuesten H2-Code werden keine Parameter akzeptiert. Schauen Sie sich hier die "Haupt" -Methode an: h2database.com/javadoc/org/h2/tools/Server.html
hshib
1
Wie hman erwähnt, akzeptiert die neueste Version keine "wahren" Parameter, also entfernen Sie sie einfach:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R
2
Neue Versionen folgen einer separaten Argumentationskonvention von Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor
7
In reinem Java müssen Sie den "true" -Parameter entfernen und die Parameter wie Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
folgt
2
Mit Spring Boot können Sie einfach "h2.console.enabled: true" und "h2.console.path: h2-console" in Ihrer Datei application.properties festlegen.
user2754985
31

Für H2 können Sie während einer Debugging-Sitzung einen Webserver in Ihrem Code starten, wenn Sie über ein Datenbankverbindungsobjekt verfügen. Sie können diese Zeile zu Ihrem Code oder als 'Überwachungsausdruck' (dynamisch) hinzufügen:

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

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

Thomas Müller
quelle
4
Kommentar für diejenigen, die Spring Data verwenden - Sie können eine Verbindung von ApplicationContext auf folgende Weise erhalten: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus
Dies ist auch großartig in einem JUnit TestWatcher @Rule
weberjn
3
Es funktioniert sogar, wenn Sie es beim Debuggen mit "evaluExpression" in IntelliJ starten. (sperrt den Rest der Uhren bis zum Anschlag)
Borjab
9

In H2 funktioniert für mich Folgendes:

Ich codiere und starte den Server wie folgt:

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

Damit wird der Server an localhostPort 9092 gestartet.

Stellen Sie dann im Code eine DB-Verbindung unter der folgenden JDBC-URL her:

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

Während des Debuggens verwende ich als Client zur Überprüfung der Datenbank die von H2 bereitgestellte, die gut genug ist, um sie zu starten. Sie müssen lediglich die folgende Java-Hauptdatei separat starten

org.h2.tools.Console

Dadurch wird ein Webserver mit einer App auf 8082 gestartet und ein Browser gestartet localhost:8082

Anschließend können Sie die vorherige URL eingeben, um die Datenbank anzuzeigen

dsantaolalla
quelle
4

Mit HSQLDB haben Sie mehrere integrierte Optionen.

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

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

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

Ein Beispiel mit JBoss finden Sie hier:

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

Sie können einen Server auch mit Ihrer Anwendung starten und auf eine speicherinterne Datenbank verweisen.

org.hsqldb.Server
fredt
quelle
3

Sie können es als JMX-Funktion verfügbar machen, die ü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 />
sibidiba
quelle
3

Dies ist ein Play 2-Controller zum Initialisieren der H2-TCP- und Webserver:

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

Für HSQLDB hat Folgendes bei mir funktioniert:

DatabaseManager.threadedDBM();

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

Ich habe auch die Swing-Version ausprobiert, aber sie hatte nur eine main, und ich war mir nicht sicher, welche Argumente zu bestehen waren. 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 also mit der URL jdbc: hsqldb: mem: dataSource, wenn Sie eine Datenquellen-Bean mit id = dataSource haben. Wenn dies nicht funktioniert, versuchen Sie es mit testdb, der Standardeinstellung.

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

Ich habe ein Problem mit der Remote-Verbindung von H2 Version 1.4.190 zu inMemory (sowie in der Datei), Connection is broken: "unexpected status 16843008"bis kein Downgrade auf 1.3.176 durchgeführt wurde. Siehe Grails beim Zugriff auf den H2 TCP-Server hängt

Grigory Kislin
quelle
1

Dies ist eher ein Kommentar zum vorherigen Beitrag von Thomas Mueller als eine Antwort, hat aber nicht genug Ruf dafür. Eine andere Möglichkeit, die Verbindung herzustellen, wenn Sie eine Spring JDBC-Vorlage sind, besteht darin, Folgendes zu verwenden:

jdbcTemplate.getDataSource().getConnection();

Wenn Sie also im Debug-Modus der Ansicht "Ausdrücke" in Eclipse hinzufügen, wird der Browser geöffnet, in dem die H2-Konsole angezeigt wird:

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

Eclipse Expressions-Ansicht

H2-Konsole

Jacqueline Rodriguez
quelle
0

Ich weiß nicht, warum es auf Ihren Maschinen gut funktioniert, aber ich musste einen Tag damit verbringen, dass es funktioniert.

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

"localhost: 8082" im Browser funktioniert ebenfalls.

Ich habe dies in die Datei mvc-dispatcher-servlet.xml aufgenommen

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

Was ist mit dem bequemen Anzeigen (und Bearbeiten) des Inhalts über ODBC & MS-Access, Excel? Softwareversionen ::

  • H2 Version: 1.4.196
  • Win 10 Postgres ODBC-Treiberversion: psqlodbc_09_03_0210
  • Für Win7 ODBC-Client: win7_psqlodbc_09_00_0101-x64.msi

H2 Server:

/*
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());

    }
}   

Windows 10 ODBC-Datenquellenkonfiguration, die von jedem ODBC-Client verwendet werden kann: Im Feld Datenbank muss der im Parameter '-key' angegebene Name verwendet werden. ODBC-Konfiguration

YDZOGODOQ
quelle