Frage

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 das DB instanziiert, das erwartete Ergebnis liefert.

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

Bitte erwähnen Sie, über welche Sie sprechen (H2 oder HSQLDB), falls Sie eine Antwort auf einen von ihnen haben.

War es hilfreich?

Lösung

Sie können H2 ausführen Webserver Innerhalb Ihrer Anwendung, die auf die gleiche In-Memory-Datenbank zugreifen. Sie können auch auf den H2 -Ausgang im Servermodus mit einem generischen JDBC -Client zugreifen Eichhörnchen.

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

Sie können auch Frühling 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 und nicht auf manuelles angewiesenes Spenden des Datenbankinhalts angewiesen. Verwenden Sie dies nur zur Fehlerbehebung.

NB Wenn Sie Spring -Test -Framework verwenden, werden Sie keine Änderungen durch eine laufende Transaktion sehen, und diese Transaktion wird unmittelbar nach dem Test zurückgerollt.

Andere Tipps

Für H2 können Sie Starten Sie einen Webserver in Ihrem Code Während einer Debugging -Sitzung, wenn Sie ein Datenbankverbindungsobjekt haben. Sie können diese Zeile Ihrem Code oder als "Uhrenausdruck" (dynamisch) hinzufügen:

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

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

In H2 funktioniert für mich:

Ich Code und starte den Server wie:

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

Das startet den Server ein localhost Port 9092.

Stellen Sie dann in Code eine DB -Verbindung für die folgende JDBC -URL her:

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

Während des Debuggens, als Kunde, um die DB zu inspizieren, benutze ich die von H2 bereitgestellte, die gut genug ist, um sie zu starten

org.h2.tools.Console

Dadurch startet ein 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

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 von Ihrer Anwendung aus starten und auf die In-Memory-Datenbanken zugreifen.

Ein Beispiel mit JBoss wird hier angegeben:

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

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

org.hsqldb.Server

Sie können es als JMX -Funktion enthüllen, die über JConsole startbar sind:

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

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

Für HSQLDB funktionierte Folgendes für mich:

DatabaseManager.threadedDBM();

Und dies brachte die GUI mit meinen Tabellen und Daten zur Sprache.

Ich habe auch die Swing -Version ausprobiert, aber sie hatte nur eine main, und ich war mir nicht sicher, ob die Argumente bestehen sollten. Wenn jemand weiß, posten Sie bitte hier.

Nur weil ich nach Stunden nach dem richtigen Datenbanknamen gesucht habe: Der Name der Datenbank ist der Name Ihrer DataSource. Versuchen Sie es also mit URL JDBC: HSQLDB: MEM: DataSource, wenn Sie eine Datenquellen -Bean mit id = dataSource haben. Wenn dies nicht funktioniert, versuchen Sie es mit TestDB, was die Standardeinstellung ist.

Ich habe ein Problem mit H2 Version 1.4.190 Remote -Verbindung zu Inmemory (sowie in der Datei) mit Connection is broken: "unexpected status 16843008" Bis zur Heruntergrade auf 1.3.176. Sehen Grails Zugriff auf den H2 -TCP -Server hängt auf

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

Der Server arbeitet mit Intellij idee u über URL "JDBC: H2: TCP: // localhost: 9092/~/default".

"Localhost: 8082" im Browser Alse funktioniert einwandfrei.

Ich habe dies in den 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>

Dies ist eher ein Kommentar zu den früheren Beitrag von Thomas Mueller als zu einer Antwort, hat aber nicht genug Ruf dafür. Eine andere Möglichkeit, die Verbindung zu erhalten, wenn Sie Spring JDBC -Vorlage sind, ist die folgende:

jdbcTemplate.getDataSource().getConnection();

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

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

Eclipse Expressions View

H2 -Konsole

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top