web-dev-qa-db-fra.com

Voir le contenu de la base de données H2 ou HSQLDB en mémoire

Existe-t-il un moyen de parcourir le contenu d’une base de données en mémoire H2 ou HSQLDB en mémoire? Par exemple, lors d’une session de débogage avec Hibernate afin de vérifier quand le vidage est exécuté; ou pour vous assurer que le script qui instancie la base de données donne le résultat attendu.

Existe-t-il un addon ou une bibliothèque que vous pouvez intégrer à votre code afin de permettre cela?

S'il vous plaît, mentionnez celle dont vous parlez (H2 ou HSQLDB) au cas où vous auriez une réponse spécifique à l'une d'entre elles.

82
jplandrain

Vous pouvez exécuter H2 serveur Web dans votre application pour accéder à la même base de données en mémoire. Vous pouvez également accéder au H2 fonctionnant en mode serveur à l'aide de n'importe quel client JDBC générique tel que SquirrelSQL .

MISE À JOUR:

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

Vous pouvez maintenant vous connecter à votre base de données via jdbc:h2:mem:foo_db URL dans le même processus ou parcourir la foo_db base de données en utilisant localhost:8082. N'oubliez pas de fermer les deux serveurs. Voir aussi: la base de données H2 en mode mémoire n'est pas accessible par la console .

Vous pouvez aussi utiliser 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>

En passant, vous ne devriez dépendre que d’affirmations et non de furtivité manuelle du contenu de la base de données. Utilisez ceci uniquement pour le dépannage.

N.B. si vous utilisez la structure de test Spring, vous ne verrez pas les modifications apportées par une transaction en cours d'exécution et cette transaction sera annulée immédiatement après le test.

55
Tomasz Nurkiewicz

Pour H2, vous pouvez démarrer un serveur Web dans votre code pendant une session de débogage si vous avez un objet de connexion à la base de données. Vous pouvez ajouter cette ligne à votre code ou en tant qu’expression de suivi (dynamiquement):

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

L'outil serveur démarrera localement un navigateur Web qui vous permettra d'accéder à la base de données.

29
Thomas Mueller

Dans H2, ce qui fonctionne pour moi est:

Je code, en démarrant le serveur comme:

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

Cela démarre le serveur sur localhost port 9092.

Ensuite, dans le code, établissez une connexion à la base de données sur l'URL JDBC suivante:

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

Pendant le débogage, en tant que client pour inspecter la base de données, j’utilise celui fourni par H2, ce qui est assez bon, pour le lancer, il vous suffit de lancer ce qui suit Java main séparément

org.h2.tools.Console

Cela démarrera un serveur Web avec une application sur 8082, lancera un navigateur sur localhost:8082

Et puis vous pouvez entrer l'URL précédente pour voir la base de données

8
dsantaolalla

Avec HSQLDB, vous avez plusieurs options intégrées.

Il existe deux gestionnaires de base de données GUI et une interface de ligne de commande pour la base de données. Les cours pour ceux-ci sont:

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

Vous pouvez démarrer l’un des programmes ci-dessus à partir de votre application et accéder aux bases de données en mémoire.

Un exemple avec JBoss est donné ici:

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

Vous pouvez également démarrer un serveur avec votre application, en le dirigeant vers une base de données en mémoire.

org.hsqldb.Server
4
fredt

Vous pouvez l'exposer en tant que fonctionnalité JMX, pouvant être démarrée 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);
    }
}

Contexte XML:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />
3
sibidiba

Il s’agit d’un contrôleur Play 2 pour initialiser les serveurs H2 TCP et 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");
        }
    }
}
3
Mariano Ruiz

Pour HSQLDB, ce qui suit a fonctionné pour moi:

DatabaseManager.threadedDBM();

Et cela a amené l'interface graphique avec mes tables et données.

J'ai aussi essayé la version Swing, mais elle n'avait qu'un main et je ne savais pas trop quels arguments passer. Si quelqu'un le sait, postez ici.

Tout simplement parce que j'ai cherché des heures pour trouver le bon nom de base de données: Le nom de la base de données est le nom de votre source de données. Essayez donc avec l'URL jdbc: hsqldb: mem: dataSource si vous avez un bean de source de données avec id = dataSource. Si cela ne fonctionne pas, essayez testdb qui est la valeur par défaut.

1
knownasilya

J'ai un problème avec la connexion à distance de la version 1.4.190 de H2 à inMemory (ainsi que dans le fichier) avec Connection is broken: "unexpected status 16843008" jusqu’à ne pas rétrograder à 1.3.176. Voir Grails accédant à H2 TCP le serveur se bloque

1
GKislin

Je ne sais pas pourquoi cela fonctionne bien sur vos machines, mais je devais passer une journée pour que cela fonctionne.

Le serveur fonctionne avec Intellij Idea U via l’URL "jdbc: h2: tcp: // localhost: 9092/~/default".

"localhost: 8082" dans le navigateur fonctionne également très bien.

J'ai ajouté ceci dans le fichier 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>

Ceci est davantage un commentaire du précédent message de Thomas Mueller qu'une réponse, mais vous n’avez pas assez de réputation pour cela. Un autre moyen d’obtenir la connexion si vous utilisez un modèle Spring JDBC consiste à utiliser les éléments suivants:

jdbcTemplate.getDataSource().getConnection();

Donc, en mode débogage, si vous ajoutez à la vue "Expressions" dans Eclipse, le navigateur vous montrera la console H2:

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

Vue des expressions Eclipse

Console H2

0
Jacqueline Rodriguez